我正在学习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>
非常感谢任何帮助。谢谢你的推荐
答案 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
值,否则raise
和exception
。
在您的情况下,Post
模型应该有slug
字段,如果它没有创建如下字段,
class Post(models.Model):
...
...
slug = models.SlugField(max_length=100)
...
...
并将您的查询更新为
post = Post.objects.get(slug=slug)