Как можно использовать slug для всех урлов в django без чего-либо до или после?

Я хочу, чтобы все урлы djaango использовали поле slug без каких-либо параметров до или после, по умолчанию только один url может использовать этот метод

ex:

path('<slug:slug>', Article.as_View(), name="articledetail"),

path('<slug:slug>', Category.as_View(), name="category"),

path('<slug:slug>', Product.as_View(), name="productdetail"),

mysite .com/articleslug

mysite .com/categoryslug

mysite .com/productslug

Как я могу это сделать? Спасибо

Это всегда будет вызывать представление 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"),

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 блога, Я не хочу писать статью или категорию & ... в урлах, только slug

mysite .com/article-slug ... mysite .com/category-slug

теперь один шаблон url в порядке, но другой шаблон url не работает и имеет 404 ошибку :(

)

@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, что и некоторые Категории.

Вернуться на верх