【发布时间】:2023-03-24 10:21:01
【问题描述】:
我对 Django 很陌生,现在我创建了一个网站,允许用户注册/登录,通过条目数据库中的“用户”字段创建与该用户关联的条目。
通过添加仅返回当前用户条目的get_queryset() 方法,我设法获得了隐藏其他用户条目的所有功能。
但我觉得这是一种不好的做法。 我觉得我重用了很多代码,并且可能有后门来显示其他用户的条目。
有没有办法完全禁用当前用户的其他用户条目,而不仅仅是不显示它?
views.py
class EntryListView(LockedView, ListView):
model = Entry
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user).order_by("-date_created")
class EntryDetailView(LockedView, DetailView):
model = Entry
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user)
class EntryCreateView(LockedView, SuccessMessageMixin, CreateView):
model = Entry
fields = ["title", "content"]
success_url = reverse_lazy("entry-list")
success_message = "Your new entry was created!"
def form_valid(self, form):
user = self.request.user
form.instance.user = user
return super(EntryCreateView, self).form_valid(form)
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user)
class EntryUpdateView(LockedView, SuccessMessageMixin, UpdateView):
model = Entry
fields = ["title", "content"]
success_message = "Your entry was updated!"
def get_success_url(self):
return reverse_lazy(
"entry-detail",
kwargs={"pk": self.object.pk}
)
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user)
【问题讨论】:
-
您可以轻松地将所有四个视图合并为一个
viewsets.GenericViewSet。这将使您可以在一个视图中执行所有操作,只需创建一个 url,您还可以通过perform_create方法向用户提供,这样您就不需要验证表单。 -
除了我的代码更长更混乱之外,处理这样的条目是否存在安全问题?
-
我认为处理条目是有效的。
-
太棒了。我想像你说的那样把我的观点合并成一个,但我真的不明白这是怎么回事。我还能在 urls.py 中保留所有 url 路径,但它们都指向这个新的 GenericViewSet 吗?
-
我已经发布了一个解释如何创建视图集的答案。
标签: python django database class