如何对django中的所有url使用slug而不在之前或之后使用任何内容



默认情况下,我希望所有djaango url都使用slug字段,前后不带任何参数只有一个url可以使用这个metod

Views.py

class ArticleDetail(DetailView):
def get_object(self):
slug = self.kwargs.get('slug')
article = get_object_or_404(Article.objects.published(), slug=slug)
ip_address = self.request.user.ip_address
if ip_address not in article.hits.all():
article.hits.add(ip_address)
return article
class CategoryList(ListView):
paginate_by = 5
template_name = 'blog/category_list.html'
def get_queryset(self):
global category
slug = self.kwargs.get('slug')
category = get_object_or_404(Category.objects.active(), slug=slug)
return category.articles.published()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['category'] = category
return context

urls.py

urlpatterns = [
path('<slug:slug>', ArticleDetail.as_view(), name="detail"),
path('<slug:slug>', CategoryList.as_view(), name="category"),
]

这是我的django博客代码,我不想写文章或类别&。。在url中,只需阻塞

mysite.com/article slug。。。mysite.com/category slug

它将始终触发Article视图,无论该段塞是否有Article。因此,您应该使URL模式不重叠,以便可以触发其他视图,例如:

path('article/<slug:slug>/', Article.as_View(), name="articledetail"),
path('category/<slug:slug>/', Category.as_View(), name="category"),
path('product/<slug:slug>/', Product.as_View(), name="productdetail"),

如果你想要一个接受单个段塞的路径,你应该定义一个视图,看看是否有一个带有该段塞的Article,如果不是Category,如果不是,Product,那么你就在视图中实现了这个逻辑,而不是在URL模式中。

@WillemVanOlsem是对的,你必须写一个这样的视图:

from django.http import HttpResponseNotFound
def slug_router(request, slug):
if Category.objects.filter(slug=slug).exists():
return CategoryList.as_view()(request, slug=slug)
elif Article.objects.filter(slug=slug).exists():
return ArticleDetail.as_view()(request, slug=slug)
else:
return HttpResponseNotFound('404 Page not found')

然后

urlpatterns = [
path('<slug:slug>', slug_router, name="slug"),
]

如果我没有记错的话。这应该是最搞笑的。我没有测试这个代码,只是在这里输入了它,所以让我知道如果它不起作用,我会帮助修复它。

请注意,如果有文章与某些类别具有相同的段塞,您将有一个偏好。

相关内容

最新更新