我正在尝试使用通过我的模型使用@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
即可解决此问题的方法?
简短回答:您不能将块存储为@property
,因为它没有存储在数据库中。
问题是您现在无法在子弹的数据库侧进行过滤,因为它在那里不存在,所以属性仅存在于Django / Python级别。
因此,应该将一个段存储在数据库中。 DetailView
将进行查询,以在database端查找具有给定标记的记录。 SlugField
或其子类之一通常会在字段上添加db_index=True
,因此数据库将创建索引以有效地查找记录。
如果您不想实现指定块的方法,则可以使用AutoSlugField
field包中的AutoSlugField
。您使用以下方法安装它:
django-autoslug
在您的虚拟环境中。接下来,您可以使用以下方法添加此字段:
django-autoslug
这不是一个好的解决方案,在您的模型中,您没有SlugField,也没有将Slug存储在db中。因此,您无法查询某个属性-这就是该属性不起作用的原因。