我想在我的详细信息网址中使用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"
非常感谢你的帮助!
答案 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查找项目。