【发布时间】:2021-04-05 08:16:42
【问题描述】:
我有一个 Django 模型,用户可以在其中创建对象并将它们保密一段时间。
class MyModel(models.Model):
creator = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
private_until = models.DateField(null=True, default=None, blank=True)
objects = MyModelManager()
在我的 ListView 中,我希望访问者只显示“非私有”对象,而对于经过身份验证的用户,我希望显示“非私有”对象以及他们自己的私有对象。所以我的经理看起来像这样:
class MyModelManager(models.Manager):
def include_his_private(self, user):
if user.is_authenticated:
include_his_private = super().get_queryset().filter(~Q(private_until__gt=datetime.date.today()))
include_his_private |= super().get_queryset().filter(Q(creator=user))
return include_his_private
else:
return super().get_queryset().filter(~Q(private_until__gt=datetime.date.today()))
def get_queryset(self):
return super().get_queryset().filter(~Q(private_until__gt=datetime.date.today()))
对于我的ListView,这很好用。但是当我单击一个对象以获取其DetailView 时,我在“URL-Level”上得到一个 404 错误。在我的网址中:
path('<slug:slug>', MyModelDetailView.as_view(), name='mymodel_detail'),
...不知何故,在我有机会将用户传递之前,Django 已经提前检查了整个 slug 与每个 Manager 允许的 slug。有什么方法可以解决我的问题?任何帮助表示赞赏。提前致谢!
编辑: 我的 DetailView 如下所示:
class MyModelDetailView(DetailView):
model = MyModel
template_name = 'mymodel_detail.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
slug = self.kwargs['slug']
if self.request.user.is_authenticated:
obj = MyModel.objects.include_his_private(self.request.user).get(slug=slug)
else:
obj = MyModel.objects.get(slug=slug)
【问题讨论】:
-
你的
MyModelDetailView看起来怎么样? -
请edit提问。
-
已编辑原帖,谢谢指点。
标签: django object model django-queryset