如何在 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)?

如何在 Django 模板中集中 URL?

django 2.2.5 URL 路径中的 URL 正则表达式

Django 1.11:在 url 中的查询参数中浮动

Django 2.2.3 如何获取所有 urls 模式和所有视图名称