簡體   English   中英

在 django 中將 id 字段更改為 slug 字段

[英]Changing id field to slug field in django

當我在 urlconfig 中使用<int:pk>來查看我的博客DetailView頁面時,一切正常。

# included from urls.py in main dir
urlpatterns = [
    path('', views.index, name='blog_index'),
    path('blogs', views.allblogs.as_view(), name='blogs'),
    path('blogs/<int:pk>', views.blogDetail.as_view(), name='blog-detail'),
]
# result url example 127.0.0.1:8000/blog/blogs/2

后來我改變主意,將 url 顯示為127.0.0.1:8000/blogs/new-blog而不是int值。 為了達到這個結果,我對urls.py進行了以下更改,

urlpatterns = [
    path('', views.index, name='blog_index'),
    path('blogs', views.allblogs.as_view(), name='blogs'),
    re_path(r'^blogs/(?P<slug_me>[-\w]+)$', views.blogDetail.as_view(), name='blog-detail'),
]

以及對models.py的以下補充:

class Blog(models.Model):
    ...

    slug = models.SlugField(default=slugify('iamslug'+str(id)))

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title)
        super(Blog, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('blog-detail', kwargs={'slug':self.slug, 'id':self.id})

但是現在當我訪問127.0.0.1:8000/blog/blogs時,它會拋出以下錯誤:

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

127.0.0.1:8000/blog/blogs/new-blog ,它會拋出這個錯誤:

Generic detail view blogDetail must be called with either an object pk or a slug in the URLconf.

我無法前進。 我嘗試更改urls.py以包含slug關鍵字,這導致Page Not Found

# changed re_path(r'^blogs/(?P<slug_me>[-\w]+)$', views.blogDetail.as_view(), name='blog-detail') to
re_path(r'^blogs/(?P<slug>[-\w]+)$', views.blogDetail.as_view(), name='blog-detail')

在你的urls.py中試試這個

urlpatterns = [
    path('', views.index, name='blog_index'),
    path('blogs', views.allblogs.as_view(), name='blogs'),
    path('blogs/<slug:slug>/', views.blogDetail.as_view(), name='blog-detail'),

您的models.py應該看起來像這樣

class Blog(models.Model):
...

slug = models.SlugField()

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = slugify(self.title)
    return super().save(*args, **kwargs)

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

嚴格使用 slugfield 並查看 django文檔以獲取 url 路徑

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM