Django:使用slugify来获取详细信息

时间:2017-08-23 18:46:14

标签: python django python-3.x django-models django-views

我想在我的详细信息网址中使用slugs,但是当我想访问这样的网址时:

本地主机:8000 /电影-1

发给我这个错误

Value Error: invalid literal for int() with base 10: 'pelicula'

这是我的模特:

from django.utils.text import slugify

class Movie(models.Model):

    name = models.CharField(verbose_name='nombre', max_length=250)

    @property
    def slug(self):
        return '{}'.format(slugify(self.name, allow_unicode=True))

我的网址:

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

最后我的观点是:

class DetailMovie(DetailView):

    model = Movie
    pk_url_kwarg = "slug"
    context_object_name = "movie"
    template_name = "detail_movie.html"

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

你有两个问题:

  • 不要使用pk_url_kwarg,默认情况下,详细视图会在视图参数上查找名为slug的参数,如果更改参数名称,请使用{ {1}}。
  • 您的模型中没有slug_url_kwarg字段,您正在定义属性,而不是字段,因此Django ORM无法对其进行查询,您和#39;重新使用该属性从模型的名称字段中自动创建slug,这很酷,但是你不能用它来查询这一点是什么。

更好的模型是这样的:

slug

这样您就拥有了该字段,并且每次保存模型时该字段都会自动更新,并且除此之外,您的视图不需要任何其他自定义:

class Movie(models.Model):
    name = models.CharField(verbose_name='nombre', max_length=250)
    slug = models.SlugField(max_length=250)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name, allow_unicode=True)
        return super(Movie, self).save(*args, **kwargs)

答案 1 :(得分:2)

这不会奏效。 slug需要是模型上保存的实际字段,否则数据库无法根据其slug查找项目。