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