Использовать @propert attr как Model Slug, представления django? - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь использовать атрибут, созданный с помощью декоратора @property в моей модели, в качестве поля slug для 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)

Мой 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 * * 1016

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Это не очень хорошее решение, в вашей модели у вас нет SlugField и вы не храните slug в db. Поэтому вы не можете запрашивать свойство - вот почему оно не работает.

1 голос
/ 22 апреля 2020

Краткий ответ : вы не можете сохранить слаг как @property, поскольку он не сохраняется в базе данных.

Проблема в том, что вы не можете фильтровать в базе данных сторона на слаге теперь, так как его там нет, свойство существует только на уровне Django / Python.

Поэтому слаг должен храниться в базе данных. A DetailView создаст запрос, который ищет запись с данным слагом на стороне database . SlugField или один из его подклассов обычно добавляет db_index=True в поле, и, таким образом, база данных создает индекс для эффективного поиска записи.

Если вы не хотите реализовывать методы для указания слага можно использовать поле AutoSlugField из пакета 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>
...