【问题标题】:Django: let user delete own User instance from default model UserDjango:让用户从默认模型用户中删除自己的用户实例
【发布时间】:2019-02-14 03:11:33
【问题描述】:

我有一个模型Creator,它通过OneToOneField 字段链接到Django 标准User 模型。 Creator 模型可以让我在添加/编辑Creator 的信息时更加灵活。现在为了删除Creator,我使用通用的DeleteView。但是,这不会删除 User 实例,因此不完全是我想要做的(例如,已删除的 Creator 的用户名是“已被占用”)。 有没有办法使用默认的DeleteView 让用户删除他的帐户? 关于删除User 实例,注销帐户,执行“删除帐户”操作的最佳做​​法是什么?用户,并确认操作成功?

到目前为止我尝试了什么:

models.py

class Creator(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    street_and_number = models.CharField(max_length=200, null=True, blank=True)
    zip_code = models.CharField(max_length=30, null=True, blank=True)
    location = models.CharField(max_length=100, null=True, blank=True)
    state_province = models.CharField(max_length=100, null=True, blank=True)
    country = models.CharField(max_length=100, null=True, blank=True)

    user = models.OneToOneField(User, on_delete=models.CASCADE)

    slug = models.SlugField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.user)
        super(Creator, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('creator-detail', args=[str(self.slug)])

views.py

class CreatorDelete(LoginRequiredMixin, DeleteView):
    #model = User # does not work
    model = Creator
    success_url = reverse_lazy('index')

    # these two methods only give access to the users own profile but not the others
    def user_passes_test(self, request):
        if request.user.is_authenticated:
            self.object = self.get_object()
            return self.object.user == request.user
        return False

    def dispatch(self, request, *args, **kwargs):
        if not self.user_passes_test(request):
            return redirect_to_login(request.get_full_path())
        return super(CreatorDelete, self).dispatch(request, *args, **kwargs)

urls.py

path('creator/<slug:slug>/delete/', views.CreatorDelete.as_view(), name='creator-delete')

另外this thread 似乎很有希望,但由于我想使用user_confirm_delete.html 模板而不是基于类的视图(实现检查用户只能删除他自己的帐户)我没有设法让它工作。

【问题讨论】:

  • 您可以使用model = User 并覆盖get_object()(当您删除User 时,链接的Creator 也将因为on_delete 级联而被删除)。然后,您可以将 slug 完全排除在 URL 之外,这样可以避免测试,并且最终可能会减少整体代码。此外,除非您的用户不是创建者,否则您可以在 Django 中定义自定义用户模型并避免使用两个模型。
  • 我用下面的答案弄清楚了。但正如您所指出的,注意 CASCADE 参数至关重要。

标签: python django django-views


【解决方案1】:

delete() 方法重写为,

class CreatorDelete(LoginRequiredMixin, DeleteView):
    .....
    .....
    .....

    # your code

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        self.object.user.delete()  # deleting the default "User" model
        return HttpResponseRedirect(reverse('index'))

【讨论】:

  • 从管理页面可以看出,这确实删除了Creator 实例,但没有删除User 实例。我想我可以省略response = super().delete(request, *args, **kwargs) 行,因为我的Creator 模型在User 实例被删除时指定CASCADE。结果我也更改了return 语句。毕竟它确实按要求工作,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2018-06-12
  • 2021-08-27
  • 2011-01-19
相关资源
最近更新 更多