Django 3 модели. Q - app_lable отображается внутри html - PullRequest
1 голос
/ 02 марта 2020

с тех пор, как я обновился до Django 3.x, у меня странное поведение. Представьте себе следующее поле в вашем models.py

content_type = models.ForeignKey(ContentType, limit_choices_to=filter_choice, on_delete=models.CASCADE, null=True, blank=True)

, которое относится к:

filter_choice = models.Q(app_label='App', model='model_x') | models.Q(app_label='App', model='model_y')

Если я теперь отображаю поле content_type в моих шаблонах html, это выглядит так: " App | Model Y ", которая выглядит довольно глупо, то же самое относится и к Django admin. Это ошибка? Я спрашиваю, потому что на Django 2.2.7 (последняя версия 2.x) у меня не было такого поведения, и только model_x и model_y были отображены как ожидалось. Было бы здорово, если бы только model_x и model_y отображались без ярлыков приложений. Есть ли какое-то решение для этого, может быть, новая опция, которая поставляется с django 3.x?

Заранее спасибо:)

1 Ответ

0 голосов
/ 02 марта 2020

Если я теперь отображаю поле content_type на моих html шаблонах, оно выглядит следующим образом: "App| Model Y", что выглядит довольно глупо.

Вот как __str__ ContentType реализовано. Действительно, если мы посмотрим на исходный код [GitHub] , мы увидим:

class ContentType(models.Model):

    # …

    def __str__(self):
        return self.app_labeled_name

    # …

    @property
    def app_labeled_name(self):
        model = self.model_class()
        if not model:
            return self.model
        return '%s | %s' % (model._meta.app_label, model._meta.verbose_name)

Если вы хотите отобразить название модели, вы Например, можно использовать:

{{ object.content_type<b>.model_class._meta.verbose_name</b> }}

Имеет смысл включить метку приложения, так как одно и то же название модели может использоваться в разных приложениях, поэтому возможно, что ваш проект имеет два Model Y s, в два разных приложения.

Кроме того, в шаблоне не очень часто отображается ContentType. Обычно это часть технических деталей вашего проекта, которую вы, вероятно, не хотите раскрывать. Если вам нужно показать тип объекта в GenericForeignKey, вы можете просто следовать GenericForeignKey и отобразить ._meta.verbose_name этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...