在Django详细视图中使用slug而不是pk

时间:2018-01-21 13:13:35

标签: python django

我想在我的详细信息视图中使用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吗?

1 个答案:

答案 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 %}