如何使sluj在django中工作

时间:2015-12-25 18:05:41

标签: django

我已经关注了basic polls tutorial,我试图修改它以使其适用于slug但它不起作用。我在views.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'),

在我的views.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",)}

但它没有用。如何让slu to显示在我的网址中

2 个答案:

答案 0 :(得分:5)

在您的视图中,您需要传递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()函数并将其分配给{{ 1}}保存之前的对象。

您可以执行以下操作:

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观看,这意味着没有2篇文章应该具有相同的detail即相同的slug。在模型中添加title约束以处理此问题。

答案 1 :(得分:1)

您在get_object_or_404中缺少参数名称。假设您的Article模型的SlugField名为slug

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