2015-12-25 38 views
3

我跟着basic polls tutorial,我试图修改它以使它适用于slu but但它不起作用。我从这次去了我的views.py我如何让slu work在django工作

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'), 

这是我的模型.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显示在我的网址中

+0

请发布您的文章型号代码。 – Saturnix

+0

本教程是该网站上的django教程。第3部分,他们演示如何显示文章ID。但不是ID我想显示slu 012 – losee

+0

@losee:在教程 –

回答

0

您在get_object_or_404中缺少参数名称。假设你Article模式有一个名为SlugFieldslug

​​

编辑:用户提供更新模型中的问题。这部分不再需要。

既然你没有张贴您的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。 取决于你的架构,可能不是一个好主意。我建议在视图或模型表单中调用slugify,如this教程。

+0

有一些不同之处:'reference_slug' VS'slug' VS单曲'。另外,我想你想写'slugify(self.title)'或类似的东西,而不是'slugify(self.slug)'(从slug中制作一个slu what是什么意思?) –

+0

@Saturnix你的代码不起作用。我已经发布了我的模型 – losee

+0

@Andrea Corbellini:非常简单:SlugField不会自动插入文本。 SlugField的工作方式与CharField完全相同。 Ioose:编码是根据您最新更新的问题更新的。 – Saturnix

3

在您的意见中,您需要通过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代替iddetail视图,这意味着没有2篇文章应该有相同的slug即同一title。在您的模型中添加unique=True约束来处理此问题。

+0

中看到的不同。 django – losee

+0

如何使用slug的文档在SlugField上查看这个文档链接https://docs.djangoproject.com/en/1.9/ref/models/fields/#slugfield –