Quiero que todas las URL de djaango usen el campo slug sin ningún parámetro antes o después, de manera predeterminada, solo una URL puede usar este método
Vistas.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 contexturls.py
urlpatterns = [ path('<slug:slug>', ArticleDetail.as_view(), name="detail"), path('<slug:slug>', CategoryList.as_view(), name="category"), ]Estos son mis códigos de blog de django, no quiero escribir artículo o categoría &... en urls, solo slug
misitio .com/article-slug ... misitio .com/category-slug
Siempre activará la vista del Article , independientemente de si hay un Article para ese slug. Por lo tanto, debe hacer que los patrones de URL no se superpongan de modo que las otras vistas puedan activarse, por ejemplo con:
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"), Si desea una ruta que acepte un solo slug, debe definir una vista que busque si hay un Article con ese slug, si ese no es el caso, una Category y, si ese no es el caso, un Product , implemente esa lógica en la vista, no en los patrones de URL.
@WillemVanOlsem tiene razón, tendrá que escribir una vista como esta:
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')Y luego
urlpatterns = [ path('<slug:slug>', slug_router, name="slug"), ]... si no me equivoco. Esta debería ser la esencia de esto. No probé este código, solo lo escribí aquí, así que avíseme si no funciona, lo ayudaré a solucionarlo.
Tenga en cuenta que tendrá preferencia si hay artículos con el mismo slug que algunas categorías.