Django:让用户从默认模型User中删除自己的User实例

时间:2018-09-09 13:30:27

标签: python django django-views

我有一个Creator模型,该模型通过User字段链接到Django标准OneToOneField模型。使用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模板,而是使用基于类的视图(以实现用户只能删除自己的帐户的检查),我没有无法使其正常工作。

1 个答案:

答案 0 :(得分: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'))