繁体   English   中英

在Django详细资料检视中使用slug而非pk

[英]Use slug instead of pk in Django detail view

我想将URL中的子弹用于详细视图,而不是主键。 但是我不知道我必须改变什么。 我的项目文件是:

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 ,必须更改什么?

您的第一个问题是您的详细信息路径无效:

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中使用段子,则将其更改为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM