Установка начальных значений в классе Meta

Допустим, у меня есть следующая модель:

class Example(models.Model):
    name = models.CharField(max_length=40)

Я хочу, чтобы его форма имела начальное значение для поля 'name', чтобы оно могло быть:

class ExampleForm(forms.ModelForm):
   name = forms.CharField(initial="initial_name")

Это хорошо для этого простого примера, но в случае, если у меня есть более сложные ModelFields (то есть с перезаписанными виджетами), я пропускаю все, когда переназначаю поле 'name' с основным forms.CharField,

Мой вопрос: есть ли способ установить инициалы в классе Meta, так же, как могут быть виджеты? что-то вроде...

 class ExampleForm(forms.ModelForm):
     class Meta:
         initials = {
             'name': 'initial_name',
         }

1 ответ

Решение

Вот варианты, которые я хотел бы проверить:

Вариант 1. Предоставьте исходные данные формы при создании экземпляра формы.

Это самый простой способ сделать это. В вашем views.py просто предоставьте данные с initial Ключевой аргумент.

views.py

from forms import ExampleForm

INITIAL_DATA = {'name': 'initial_name'}

def my_view(request):
    ...
    form = ExampleForm(initial=INITIAL_DATA)
    ...

Не слишком сложно. Единственным недостатком будет то, что вы используете и злоупотребляете этой формой и устаете передавать исходные данные.

Вариант 2 (идеально подходит для вашего случая): укажите начальные данные в __init__ метод класса.

Формы в Django предназначены для принятия начальных данных при создании экземпляра, поэтому вы можете связываться с этими значениями в __init__ метод. Без тестирования это, как я думаю, будет выглядеть так:

forms.py

class ExampleForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        """If no initial data, provide some defaults."""
        initial = kwargs.get('initial', {})
        initial['name'] = 'initial_name'
        kwargs['initial'] = initial
        super(ExampleForm, self).__init__(*args, **kwargs)

Это было бы оптимальным, потому что вы можете игнорировать initial={...} в коде представления.

Другие вопросы по тегам