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

Django How to represent slug as ID for function based view

我正在学习 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.pypost = Post.objects.get(id=slug),我觉得这是错误的表述,正确的做法是什么?

我得到以下代码的错误

非常感谢任何帮助..提前致谢

假设您的 post 模型有一个 slug 字段,您需要执行以下操作:

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

可译为:

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

错误表明 Post 模型(django 自己创建)中的 id 字段是一个 AutoField(检查 this) 就 sql 而言,它基本上是一个 bigint 字段。因此,在查询 id 字段时,它需要一个强制性的 int 值,否则将 raise 一个 exception.

在您的情况下,Post 模型应该有一个 slug 字段,如果它不适合创建一个如下所示,

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

并将您的查询更新为,

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