【发布时间】: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