我正试图在我的模型中使用使用@property
装饰器创建的属性作为djangoDetailsView
的段塞字段,如下所示:
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
的情况下解决这个问题?
简短回答:您不能将段塞存储为@property
,因为它不会存储在数据库中。
问题是,您现在无法在slug的数据库端进行过滤,因为它不存在,属性只存在于Django/Python级别。
因此,段塞应该存储在数据库中。DetailView
将进行查询,在数据库端查找具有给定段塞的记录。SlugField
或它的一个子类通常会在字段上添加db_index=True
,因此数据库会创建索引来有效地查找记录。
如果不想实现指定段塞的方法,可以使用django-autoslug
包中的AutoSlugField
字段。你用安装这个
pip3 installdjango-autoslug
在您的虚拟环境中。接下来,您可以添加此字段:
from autoslug importAutoSlugField
from django.db import models
class Province(models.Model):
name = models.CharField(max_length=30)
code = models.CharField(max_length=10)
slug =AutoSlugField(populate_from='name')
这不是一个好的解决方案,在您的模型中,您没有SlugField,也没有将slug存储在数据库中。所以你不能查询一个属性——这就是它不起作用的原因。