首页 > 解决方案 > 如何在我的 url 中实现我的 sluig 而不是 Django 中的主键?

问题描述

为上次没有正确定义细节而道歉。在这里,我已经编辑并发布了更多详细信息。我正试图让我的 slug 进入我的网址。这是来自 app 目录中 utils.py 的 slugify:

from django.utils.text import slugify

    def get_unique_slug(model_instance, slugable_field_name, slug_field_name):
        slug = slugify(getattr(model_instance, slugable_field_name))
        unique_slug = slug
        extension = 1
        ModelClass = model_instance.__class__

        while ModelClass._default_manager.filter(
            **{slug_field_name: unique_slug}
        ).exists():
            unique_slug = '{}-{}'.format(slug, extension)
            extension += 1

        return unique_slug

这是我的模型:

from django.db import models
from django.urls import reverse
from .utils import

    class Post(models.Model):
        name = models.CharField(db_index=True, max_length=300, blank=False)
        content = models.TextField()
        slug = models.SlugField(max_length=140, unique=True)

        def __str__(self):
            return self.name
        def save(self, *args, **kwargs):
            if not self.slug:
                self.slug = get_unique_slug(self, 'name', 'slug')
            super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse("pastebin_app:detail",kwargs={'slug':self.slug})

和 urls.py 代码:

from django.conf.urls import url
from . import views
from .views import PostCreateView, PostCreateView, PostUpdateView, PostDeleteView,SearchView

app_name = 'pastebin_app'
urlpatterns = [
    url(r'^search/$', views.SearchView.as_view(), name = 'search'),
    url(r'^$', views.PostCreateView.as_view(), name = 'root'),
    url(r'^(?P<slug>\[-\w\d]+)/$', views.PostDetailView.as_view(),name='detail'),
    url(r'^update/(?P<slug>\[-\w]+)/$', views.PostUpdateView.as_view(),name='update'),
    url(r'^delete/(?P<slug>\[-\w]+)/$', views.PostDeleteView.as_view(),name='delete'),
]

所以现在我收到带有异常值的 NoReverseMatch 错误:异常值:

Reverse for 'detail' with keyword arguments '{'slug': 'slug-implemention2'}' not found. 1 pattern(s) tried: ['(?P<slug>\\[-\\w\\d]+)/$']

'detail' 是我正在执行 get_absolute_url 的 url。提前致谢

标签: djangopython-3.xdjango-formsdjango-views

解决方案


我已经弄清楚了,我感谢所有的关注。我在我的网址中都调用了 sulg 和 pk ,这解决了pk='5' not found的问题,编辑如下:

url(r'^(?P<slug>[\w-]+)/(?P<pk>\d+)/$', views.PostDetailView.as_view(),name='detail'

UpdateView url 和 DeleteView 的标记也是一样的。
然后在models.py中的get_absolute_url,我在views.py中再次调用了slug和pk:

def get_absolute_url(self):
        return reverse("pastebin_app:detail",kwargs={'slug':self.slug,
                                                'pk': self.pk})

然后我忘记了许多像我这样的初学者可能会做的另一件事是更新详细信息模板,其中我有两个按钮用作 UpdateView 和 DetailView。我不确定这可能有一些捷径

也:

<a class="btn btn-primary" href="{% url 'pastebin_app:update' slug=post_detail.slug pk=post_detail.pk %}" role="button">Update</a></p>
   <a class="btn btn-warning" href="{% url 'pastebin_app:delete' slug=post_detail.slug pk=post_detail.pk %}" role="button">Delete</a>

我忘记在这里调用 slug 和 pk 了。


推荐阅读