Django如何将slug表示为基于函数的视图的ID

时间:2016-03-18 18:27:57

标签: django django-urls slug

我正在学习django并且遇到了 slug 并且在向基于函数的视图发送参数时遇到了影响

我的urls.py

url(r'^(?P<slug>[\w-]+)/$', views.detail, name='detail'),

Views.py

def detail(request, slug):
    post = Post.objects.get(id=slug)
    comments=post.comment_set.all()
    forms=CommentForm
    if request.method == 'POST':
        form=CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.title = post
            print comment
            comment.save()
        else:
          print form.errors
    else:
        form = PostForm()

model.py

class Post(models.Model):
    title=models.CharField(max_length=200)
    description=models.TextField(max_length=10000)
    pub_date=models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=40, unique=True)

    def __unicode__(self):
        return self.title

    def description_as_list(self):
        return self.description.split('\n')

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

在views.py post = Post.objects.get(id=slug)第二行视图中,我觉得这是错误的表示,这可能是正确的方法吗?< / p>

我得到以上代码的错误 enter image description here

非常感谢任何帮助。谢谢你的推荐

2 个答案:

答案 0 :(得分:3)

假设您的帖子模型有一个slug字段,您可以这样做:

post = Post.objects.get(slug=slug)

可翻译为:

post = Post.objects.get(<name_of_field>=<argument_in_url>)

答案 1 :(得分:1)

错误表示id模型中的Post字段(django自行创建)是AutoField(检查 this )就bigint而言,它基本上是sql字段。因此,在查询id字段时,它需要强制int值,否则raiseexception

在您的情况下,Post模型应该有slug字段,如果它没有创建如下字段,

class Post(models.Model):
    ...
    ...
    slug = models.SlugField(max_length=100)
    ...
    ...

并将您的查询更新为

post = Post.objects.get(slug=slug)