如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?
Posted
技术标签:
【中文标题】如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?【英文标题】:How can use slug for all urls in django without anything before or after? 【发布时间】:2022-01-15 20:16:38 【问题描述】:我希望所有 djaango url 使用 slug 字段,之前或之后没有任何参数,默认情况下 只有一个 url 可以使用这个方法
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 中写文章或类别 & ...,只是 slug
mysite .com/article-slug ... mysite .com/category-slug
【问题讨论】:
它总是会触发Article
视图,无论该 slug 是否有 Article
。
这能回答你的问题吗? Django multiple slug urls
【参考方案1】:
它总是会触发 Article
视图,无论该 slug 是否有 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"),
如果你想要一个接受单个 slug 的路径,你应该定义一个视图来查看是否存在带有该 slug 的 Article
,如果不是这种情况,则为 Category
,如果不是,则为Product
您因此在视图中实现了该逻辑,而不是在 URL 模式中。
【讨论】:
不,我想要这样的网址:mysite .com/articleslug @SaraNancy:那么您需要创建一个复杂的视图,首先查看是否有带有该 slug 的文章,如果分类不合格,如果产品不合格,那么单个视图。 嗨@WillemVanOlsem,非常感谢❤️【参考方案2】:@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"),
]
...如果我没记错的话。这应该是它的要点。 这段代码我没有测试,只是在这里输入的,所以如果它不起作用,请告诉我,我会帮助修复它。
请注意,如果存在与某些类别具有相同 slug 的文章,您将有一个偏好。
【讨论】:
嗨@barney-szabolcs 我只能说woooow,效果很好?我努力了几天,但没有得到任何结果。你和 WillemVanOlsem 是我的救赎天使。非常感谢❤️ 嗨@SaraNancy 很高兴你给我们写信,我们可以提供帮助! ❤️ 祝你未来好运! ?以上是关于如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?的主要内容,如果未能解决你的问题,请参考以下文章
捕获 Django views.py 中的所有 URL 参数?
如何让 Django urls.py 识别 url 中的 # (hash)?