Установка начальных значений в классе 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={...}
в коде представления.