我如何让蛞蝓在 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=Truedb_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 的文档在哪里 SlugFielddocs.djangoproject.com/en/1.9/ref/models/fields/#slugfield查看此文档链接【参考方案2】:

您在get_object_or_404 中缺少参数名称。假设您的 Article 模型有一个名为 slugSlugField

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[-\\m]+)/$'] 我在此错误中看到的 url (['blog/(?P&lt;slug&gt;[-\\m]+)/$']) 与我在您的 urls.py 中看到的不同

以上是关于我如何让蛞蝓在 django 中工作的主要内容,如果未能解决你的问题,请参考以下文章

jwt令牌的刷新如何在django REST angular中工作

Django中的Send_mail,在shell中工作,在本地工作,不在视图中

get_sucess_url 如何在 django 中工作?

use_for_related_fields 如何在 Django 中工作?

如何让 Mailchimp 弹出窗口在 Chrome 中工作

如何让别名在所有 shell 中工作?