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