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

Posted

技术标签:

【中文标题】Django 如何将 slug 表示为基于函数的视图的 ID【英文标题】:Django How to represent slug as ID for function based view 【发布时间】:2016-07-05 15:26:49 【问题描述】:

我正在学习 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()

模型.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)第二行视图中,我觉得这是错误的表示,正确的做法是什么?

我得到以下代码的 错误

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

【问题讨论】:

你能展示一下你的Post 模特吗? @ParagTyagi-morpheus-..我已经通过添加 models.py 来编辑问题...请检查 请检查我的回答。 【参考方案1】:

错误表明Post 模型(django 自己创建)中的id 字段是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)

【讨论】:

【参考方案2】:

假设你的帖子模型有一个 slug 字段,你会想要这样做:

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

可以翻译为:

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

【讨论】:

以上是关于Django 如何将 slug 表示为基于函数的视图的 ID的主要内容,如果未能解决你的问题,请参考以下文章

将 Pk 或 Slug 传递给 Django 中的通用 DetailView?

Django:如果 slug 错误,则重定向 url

Django:两个模型中的一个 url 搜索(cbv)

基于 Django 类的“method_splitter” - 分别传递 2 个 slug 作为模型名称和字段值

django中的Slug字段错误

在Django Admin中将预填充的段塞字段设置为只读