【问题标题】:How can use slug for all urls in django without anything before or after?如何在 django 中的所有 url 使用 slug 之前或之后没有任何内容?
【发布时间】: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

标签: django django-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 很高兴你给我们写信,我们可以提供帮助! ❤️ 祝你未来好运! ?
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多