Как можно использовать 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, что и некоторые Категории.