我想在我的详细信息视图中使用URL中的slug而不是主键。但我不知道我必须改变什么。我的项目文件是:
models.py
from django.db import models
from django.utils import timezone
class Kategorie(models.Model):
title = models.CharField(max_length=250, verbose_name="Kategoria")
slug = models.SlugField(unique=True, max_length=250, verbose_name="Przyjazny adres url")
class Meta:
verbose_name="Kategoria"
verbose_name_plural="Kategorie"
def __str__(self):
return self.title
class Wpisy(models.Model):
title = models.CharField(max_length=400, verbose_name="Tytuł")
slug = models.SlugField(unique=True, max_length=400,verbose_name="Przyjazny adres url")
content = models.TextField()
created_date = models.DateTimeField(blank=True, null=True, verbose_name="Data utworzenia")
category = models.ForeignKey(Kategorie, verbose_name="Kategoria", on_delete=models.CASCADE)
class Meta:
verbose_name="Wpis"
verbose_name_plural="Wpisy"
def __str__(self):
return self.title
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.lista_bajek, name="lista_bajek"),
path('bajki/',views.lista_bajek, name='lista_bajek'),
path('bajki/(?P<pk>\d+)/$', views.detale_bajki, name='detale_bajki'),
]
views.py
from django.shortcuts import render, get_object_or_404
from .models import Wpisy
def lista_bajek(request):
lista_bajek = Wpisy.objects.all()
context ={'lista_bajek': lista_bajek,}
return render(request, 'bajki/lista_bajek.html', context=context)
def detale_bajki(request, pk):
detale_bajki = get_object_or_404(Wpisy, pk=pk)
return render(request, 'bajki/detale_bajki.html', {'detale_bajki': detale_bajki})
模板文件:
{% extends 'bajki/index.html'%}
{% block content %}
<!DOCTYPE html>
<html>
<head>
<title>Bajki</title>
</head>
<body>
{% for bajki in lista_bajek %}
Tytuł : <a href="{% url 'detale_bajki' pk=bajki.pk %}">{{bajki.title}} </a><br>
{% endfor %}
{% endblock %}
</body>
</html>
有人可以告诉我必须要更改才能拥有一个不错的SEO地址,例如/bajki/winnie-the-pooh
吗?
答案 0 :(得分:1)
您的第一个问题是您的详细信息路径无效:
path('bajki/(?P<pk>\d+)/$', views.detale_bajki, name='detale_bajki'),
如果要使用正则表达式,请使用re_path
。使用路径时,您应该使用<converter:name>
。
path('bajki/<int:pk>/', views.detale_bajki, name='detale_bajki'),
然后,如果您想在URL中使用slug,请将其更改为:
path('bajki/<slug>/', views.detale_bajki, name='detale_bajki'),
然后您需要更新视图:
def detale_bajki(request, slug):
detale_bajki = get_object_or_404(Wpisy, slug=slug)
最后,您需要在反转URL时使用slug,例如:
{% url 'detale_bajki' slug=bajki.slug %}