我有一个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
模板,而是使用基于类的视图(以实现用户只能删除自己的帐户的检查),我没有无法使其正常工作。
答案 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'))