Получение имени (Verbose Name) модели или объекта из шаблона
И возникла необходимость вывести подробное имя (Verbose Name) в шаблонах Django.
При попытке сделать это также как и в коде Python ничего > не получится, так как шаблонизатор Django не дает доступ к приватному объекту _meta .
Но для решения проблемы можно сделать простой шаблонный фильтр.
Создаем файл templatetags/my_tags.py , который содержит такой код:
from django import template register = template.Library() @register.filter def verbose_name(obj): return obj._meta.verbose_name @register.filter def verbose_name_plural(obj): return obj._meta.verbose_name_plural
Теперь можно выводить имя модели в шаблоных с помощью этого фильтра:
Verbose name on class field в django
Противовесом написанию метода init() является написание метода deconstruct(). Он используется во время миграции модели, чтобы сказать Django как взять экземпляр вашего нового поля и уменьшить его до сериализованную форму — в частности, какие аргументы передать в init() для его повторного создания.
Если вы не добавили никаких дополнительных опций поверх поля, которое вы унаследовали от него, то нет необходимости писать новый метод deconstruct() метод. Однако если вы изменяете аргументы, переданные в методе init() (как мы делаем в HandField), то вам нужно будет дополнить передаваемые значения.
Метакласс в моделях — Django
Django — это высокоуровневый веб-фреймворк Python, который способствует быстрой разработке и чистому, прагматичному дизайну. Созданный опытными программистами, он берет на себя большую часть хлопот, связанных с веб-разработкой, так что вы можете сосредоточиться на написании своего приложения без необходимости изобретать колесо. Он бесплатный и с открытым исходным кодом. Перед тем, как двигаться дальше, изучите модели Django.
Метамодель (Meta Model) — это, по сути, внутренний класс вашего класса модели. Метамодель в основном используется для изменения поведения полей вашей модели, таких как изменение опций заказа, verbose_name, и многих других параметров. Добавление класса Meta к вашей модели совершенно необязательно. Для того чтобы использовать метамодель, вы должны добавить класс Meta в вашу модель, как показано ниже:
class student(models.Model): class Meta: options.
Опции метамодели
Метамодель имеет множество опций, которые вы можете предоставить вашей модели в ее внутреннем классе meta
1. abstract
Если abstract = True, то данная модель будет абстрактным базовым классом:
class student(models.Model): class Meta: abstract = True
2. app_label
Если модель определена за пределами приложений в INSTALLED_APPS , то ей необходимо объявить, какому приложению она принадлежит:
class student(models.Model): class Meta: app_label = 'myapp' # add app name here
3. verbose_name
verbose_name — это по сути понятное человеку имя для вашей модели.
class student(models.Model): class Meta: verbose_name = "stu" # add verbose_name here
4. ordering
Ordering (упорядочивание) в основном используется для изменения порядка полей вашей модели.
class student(models.Model): class Meta: ordering = [-1]
Добавьте упорядочивание вот так [-1], и порядок изменится на убывающий.
5. proxy
Если мы добавим proxy = True, модель, которая является подклассом другой модели, будет рассматриваться как прокси-модель.
class Teacher(models.Model): pass class Student(Teacher): class Meta: proxy = True
Вот как мы можем создать прокси-модель.
6. permissions
Дополнительные permissions (разрешения), которые нужно внести в таблицу разрешений при создании этого объекта. Разрешения на добавление, изменение, удаление и просмотр автоматически создаются для каждой модели.
class student(models.Model): class Meta: permissions = []
Вы можете добавить дополнительные разрешения внутри списка.
7. db_table
Мы можем перезаписать имя таблицы, используя db_table в классе meta.
class student(models.Model): class Meta: db_table = 'X'
Это изменит имя таблицы на X.
8. get_latest_by
Возвращает последний объект в таблице на основе заданного поля, обычно используемого для DateField, DateTimeField или IntegerField.
class student(models.Model): class Meta: get_latest_by = "order_date"
Возвращает последний по порядку возрастания order_date .
Методы класса (classmethod): нужны ли они? Об этом расскажем на бесплатном вебинаре, который пройдет уже 12 октября. Поговорим об особенностях ООП в python: о наследовании и миксинах, рассмотрим ситуации, когда без classmethod не обойтись, посмотрим на реализации в известных библиотеках.
verbose_name для вычислимого поля модели Django
Есть следующая модель. В полях, которые я указываю собственноручно verbose_name прописывается понятным образом. А как прописать verbose_name для поля которое является вычислимым? В данном случае days_worked.
class Employee(models.Model): name = models.CharField(max_length=50, verbose_name="ФИО") date_of_start = models.DateField(verbose_name="Дата оформления") position = models.ForeignKey("Position", on_delete=models.PROTECT, verbose_name="Должность") department = models.ForeignKey("Department", on_delete=models.PROTECT, verbose_name="Подразделение") def __str__(self): return self.name @property def days_worked(self): days_worked = datetime.now().date() - self.date_of_start return days_worked.days
Отслеживать
задан 9 ноя 2021 в 23:15
141 6 6 бронзовых знаков
А действительно ли требуется это прописывать именно в модели? Может, в ModelAdmin тоже подойдёт?
9 ноя 2021 в 23:40
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Судя по всему verbose_name для @property не может быть установлено, но вместо него можно использовать short_description:
days_worked.fget.short_description = 'блаблабла'
Отслеживать
ответ дан 10 ноя 2021 в 3:41
Sergey Tatarintsev Sergey Tatarintsev
6,145 2 2 золотых знака 6 6 серебряных знаков 14 14 бронзовых знаков
Sergey Tatarincev, да, спасибо большое, работает. Учту такую тонкость настройки)
10 ноя 2021 в 8:36
- python
- django
- django-model
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.26.8280