首页 > 解决方案 > 使用基于 @propert 的 attr 作为模型 slug,django 的视图?

问题描述

我正在尝试使用使用@property我的模型中的装饰器创建的属性作为 django 的 slug 字段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

标签: pythondjangodjango-viewsslug

解决方案


简短的回答:你不能将 slug 存储为@property从那时起它没有存储在数据库中。

问题是您现在无法在 slug 的数据库端进行过滤,因为它在那里不存在,一个属性只存在于 Django/Python 级别。

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

如果您不想实现指定 slug 的方法,您可以使用 package.json 中的AutoSlugFieldfielddjango-autoslug。你安装这个:

pip3 install django-autoslug

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

from autoslug import AutoSlugField
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')

推荐阅读