使用基于@propert的attr作为Model slug,django的观点?

问题描述 投票:0回答:2

我正在尝试使用通过我的模型使用@property装饰器创建的属性作为Django DetailsView的子弹字段,如下所示:

class Province(models.Model):
    name = models.CharField(max_length=30)
    code = models.CharField(max_length=10)

    @property
    def slug(self):
        return slugify(self.name)

我的网址:

path("map/<slug:slug>", MyView.as_view())

我的看法:

class MyView(DetailView):
    template_name="myapp/map.html"
    context_object_name = "province"
    model = Province

但是访问页面时出现以下异常:

Cannot resolve keyword 'slug' into field. Choices are: code, id, name

是否有一种无需使用显式SlugField即可解决此问题的方法?

python django django-views slug
2个回答
1
投票

简短回答:您不能将块存储为@property,因为它没有存储在数据库中。

问题是您现在无法在子弹的数据库侧进行过滤,因为它在那里不存在,所以属性仅存在于Django / Python级别。

因此,应该将一个段存储在数据库中。 DetailView将进行查询,以在database端查找具有给定标记的记录。 SlugField或其子类之一通常会在字段上添加db_index=True,因此数据库将创建索引以有效地查找记录。

如果您不想实现指定块的方法,则可以使用AutoSlugField field包中的AutoSlugField。您使用以下方法安装它:

django-autoslug

在您的虚拟环境中。接下来,您可以使用以下方法添加此字段:

django-autoslug

0
投票

这不是一个好的解决方案,在您的模型中,您没有SlugField,也没有将Slug存储在db中。因此,您无法查询某个属性-这就是该属性不起作用的原因。

© www.soinside.com 2019 - 2024. All rights reserved.