【问题标题】:Django: use slugify for detail urlDjango:使用 slugify 获取详细网址
【发布时间】:2017-08-23 18:46:14
【问题描述】:

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

localhost:8000/movie-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"

非常感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    你有两个问题:

    • 不要为此使用pk_url_kwarg,默认情况下,详细视图将在视图参数上查找名为slug的参数,如果您更改参数名称,请使用slug_url_kwarg
    • 您的模型中没有 slug 字段,您正在定义一个属性,这不是一个字段,因此 Django ORM 无法查询它,您正在使用该属性自动创建 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)
    

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

    class DetailMovie(DetailView):
        model = Movie
        context_object_name = "movie"
        template_name = "detail_movie.html"
    

    【讨论】:

      【解决方案2】:

      这行不通。 slug 必须是保存在模型上的实际字段,否则数据库将无法根据其 slug 查找项目。

      【讨论】:

        猜你喜欢
        • 2021-09-19
        • 2011-08-08
        • 1970-01-01
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        相关资源
        最近更新 更多