【发布时间】:2020-06-22 12:32:01
【问题描述】:
我有一个带有 DetailView 类的小新闻应用程序,如下所示:
class DetailView(LoginRequiredMixin,generic.DetailView):
model = NewsItem
template_name = 'news/detail.html'
def get_object(self):
obj = super().get_object()
if self.request.user.is_superuser or obj.published:
return obj
和这样的 urls.py 配置:
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
path('<int:itemId>/publish', views.publish, name='publish'),
]
现在,当我将无效 ID 传递给详细视图时,它会自动重定向到 404。我想知道是否可以只将空对象传递给 DetailView。然后,模板将自行处理 404。
另外:尽管到目前为止它有效,但我觉得我处理权限要求的方式(覆盖 get_object 方法)不是正确的方式/Django 做事的方式
解决方案:我改变了 get_object 的覆盖,如下所示:
class DetailView(LoginRequiredMixin,generic.DetailView):
model = NewsItem
template_name = 'news/detail.html'
def get_object(self):
queryset = self.get_queryset()
pk = self.kwargs.get(self.pk_url_kwarg)
if pk is not None:
queryset = queryset.filter(pk=pk)
else:
raise AttributeError("No article id provided")
try:
return queryset.get()
except queryset.model.DoesNotExist:
return None
它与原始的 get_object 方法基本相同,只是没有检查 slug 值,如果 queryset.get() 调用捕获 queryset.model.DoesNotExist 异常,它返回 None
【问题讨论】:
-
编辑中的解决方案
标签: django django-views http-status-code-404