Django: как переопределить verbose_name и help_text модельных полей - PullRequest
0 голосов
/ 04 марта 2019

Мне нужны некоторые дополнительные сведения / мнения по следующему вопросу:

Я хочу перезаписать verbose_name и help_text для всех полей определенных моделей django.

У меня уже есть структура, в которой эти значения хранятся в базе данных.Поля перебираются:

Contract._meta.get_fields()

Я использую набор форм с начальными значениями / значениями по умолчанию для этих полей.Пока это работает хорошо.Теперь моя проблема заключается в том, что я хочу сохранить значения по умолчанию в модели и переопределить это везде, где доступны значения (формы администратора, формы, шаблоны и т. Д.).

Я думаю, что-то вроде Mixin, хотя я думаю, что тогда мне придется изменить слишком много django-кода.Другая возможность, которая уже сработала, - это вызов функции вместо verbose_name и help_text.

Например:

title = models.CharField(max_length=120, blank=True, null=True, verbose_name=get_vname('title') help_text=get_help_text('title'))
title_long = models.CharField(max_length=120, blank=True, null=True, verbose_name=get_vname('title_long') help_text=get_help_text('title_long'))

Но это слишком много ручных изменений, и мне нужно также сохранить значения по умолчанию.Есть ли лучший способ (СУХОЙ) для достижения этой цели?Может быть, есть расширение?

1 Ответ

0 голосов
/ 12 марта 2019

Я создал миксины для этого сейчас и

class ChangeFieldNamesMixin(models.Model):

def __init__(self, *args, **kwargs):
    model_fields = self._meta.get_fields()
    initialise_texts(self._meta.model_name, model_fields)
    super(ChangeFieldNamesMixin, self).__init__(*args, **kwargs)

class Meta:
    abstract = Trueenter code here

def initialise_texts(name, model_fields):
model_field_name = name + 'Field'
Model = apps.get_model("custom", model_field_name)
field_names_to_create = []
field_dict = compose_field_dict(name, Model)

# create entries in table if empty
if len(field_dict) == 0:
    for entry in model_fields:
        if entry.editable:
            attrs = {'name': entry.name, 'help_text': entry.help_text, 'label': entry.verbose_name}
            new_entry = Model(**attrs)
            field_names_to_create.append(new_entry)

            print('Saving {}'.format(new_entry))
    field_list = Model.objects.bulk_create(field_names_to_create)
    compose_field_dict(name, Model, field_list)
else:

    for entry in model_fields:
        if entry.editable:
            key = entry.name

            if key in field_dict.keys():
                setattr(entry, 'verbose_name', field_dict[key].label)
                setattr(entry, 'help_text', field_dict[key].help_text)

Я не слишком рад этому решению, потому что я думаю, что должен быть лучший способ инициализировать поля в базе данных.Я довольно новичок в разработке на django и python (более опытный в Java), поэтому некоторые замечания будут оценены.

...