我如何让蛞蝓在 django 中工作
Posted
技术标签:
【中文标题】我如何让蛞蝓在 django 中工作【英文标题】:How do I make the slugs work in django 【发布时间】:2016-03-31 15:07:06 【问题描述】:我已关注basic polls tutorial,并尝试对其进行修改以使其适用于蛞蝓,但它不起作用。我从这个观点出发。py
def detail(request, article_id):
details = "blog/detail.html"
context =
"article": get_object_or_404(Article, pk=article_id)
return render(request, details, context)
和
url(r'^(?P<article_id>[0-9]+)/$', views.detail, name='detail'),
在我的意见中。py
def detail(request, slug):
details = "blog/detail.html"
context =
"article": get_object_or_404(Article, slug)
return render(request, details, context)
和
url(r'^(?P<slug>[\w-]+)/$', views.detail, name='detail'),
这是我的models.py
from django.db import models
from django.contrib.auth.models import User
class Article(models.Model):
author = models.ForeignKey(User)
title = models.CharField(max_length=250)
slug = models.SlugField()
body = models.TextField()
created = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
这是我的 admin.py
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = "slug": ("title",)
但它不起作用。如何让蛞蝓显示在我的网址中
【问题讨论】:
请发布您的文章型号代码。 教程是网站上的django教程。第 3 部分,他们演示了如何显示文章 ID。但不是 id 我想显示 slug @losee:我在教程中找不到任何名为Article
的模型
@AndreaCorbellini:我也找不到对任何 slug 字段的任何引用。
提示: 将 unique=True
和 db_index=True
添加到您的 SlugField
以使您的模型安全快速。
【参考方案1】:
在您看来,您需要传递slug
参数。
def detail(request, slug):
details = "blog/detail.html"
context =
"article": get_object_or_404(Article, slug=slug) # pass slug
return render(request, details, context)
如果您使用管理员创建Articles
,则slug
将使用title
字段进行预填充。但是,如果您想创建 article
而不是在管理员中创建,则需要在模型的 save()
中显式调用 slugify()
函数并将其分配给 article
对象,然后再保存它。
你可以这样做:
class Article(models.Model):
def save(self, *args, **kwargs):
self.slug = slugify(self.title) # set the slug explicitly
super(Article, self).save(*args, **kwargs) # call Django's save()
注意:由于您使用slug
而不是id
用于detail
视图,这意味着没有两篇文章应该具有相同的slug
,即相同的title
。在您的模型中添加 unique=True
约束以处理此问题。
【讨论】:
我试过了。关于如何在 django 中使用 slugs 的文档在哪里 在SlugField
docs.djangoproject.com/en/1.9/ref/models/fields/#slugfield查看此文档链接【参考方案2】:
您在get_object_or_404
中缺少参数名称。假设您的 Article
模型有一个名为 slug
的 SlugField
:
get_object_or_404(Article, slug=slug)
编辑:用户更新提供模型的问题。这部分不再需要。
由于您没有发布您的 Article
模型,我将提供一个示例,说明您应该如何对其进行编码以使其与我的示例兼容:
from django.utils.text import slugify
from django.db import models
class Article(models.model):
#…
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.slug)
super(Article, self).save(*args, **kwargs)
复制自this 答案。注意我们如何覆盖 save 方法来自动生成 slug。 可能不是一个好主意,具体取决于您的架构。我建议在 this 教程中的视图或模型形式中调用 slugify
。
【讨论】:
有些不一致:reference_slug
vs slug
vs s
。另外,我认为您想写slugify(self.title)
或类似的东西,而不是slugify(self.slug)
(用蛞蝓制造蛞蝓有什么意义?)
@Saturnix 您的代码不起作用。我也发布了我的模型
@Andrea Corbellini:非常简单:SlugField 不会自动对您的文本进行 slugify。 SlugField 的工作方式与 CharField 完全一样。 Ioose:考虑到您新更新的问题,代码已更新。
@Saturnix 这是我使用你的答案 Reverse for 'detail' with arguments '(1,)' 和关键字参数 '' not found 时遇到的错误。尝试了 1 种模式:['blog/(?P['blog/(?P<slug>[-\\m]+)/$']
) 与我在您的 urls.py 中看到的不同以上是关于我如何让蛞蝓在 django 中工作的主要内容,如果未能解决你的问题,请参考以下文章
jwt令牌的刷新如何在django REST angular中工作
Django中的Send_mail,在shell中工作,在本地工作,不在视图中
get_sucess_url 如何在 django 中工作?
use_for_related_fields 如何在 Django 中工作?