Подтвердить что ты не робот

Разница между "начальными" и "связанными данными" в Django?

Для примера, подобного этому:

class MyForm(forms.Form): 
    name = forms.CharField()

Я пытаюсь понять, какая разница между следующими двумя фрагментами:

"Связанные данные":

my_form = MyForm({'name': request.user.first_name})

"Начальные данные":

my_form = MyForm(initial={'name': request.user.first_name})

Документация, по-видимому, предполагает, что "начальный для динамических начальных значений", и тем не менее возможность передать "связанные данные" конструктору выполняет точно такую ​​же вещь. Я использовал исходные данные в прошлом для динамических значений, но у меня возникает соблазн использовать более простой стиль "привязанных данных", но хотелось бы получить представление о том, какова реальная разница между этими двумя стилями.

4b9b3361

Ответ 1

Здесь ключевая часть из django docs на связанные и несвязанные формы.

Экземпляр формы либо привязан к набору данных, либо unbound:

  • Если его связанный с набором данных, он способен проверять эти данные и отображать форму как HTML с данными, отображаемыми в HTML.
  • Если его unbound, он не может выполнить проверку (потому что theres нет данных для проверки!), но он все равно может отображать пустую форму как HTML.

Вы не можете увидеть разницу для формы примера, которую вы дали, потому что форма действительна в стиле "привязанных данных". Позвольте расширить форму, добавив поле age, тогда разница будет более очевидной.

class MyForm(forms.Form):
    name = forms.CharField()
    age = forms.IntegerField()

Связанная форма

my_form = MyForm({'name': request.user.first_name})

Эта форма недопустима, поскольку age не указывается. Когда вы визуализируете форму в шаблоне, вы увидите ошибки проверки для поля age.

Несвязанная форма с динамическими исходными данными

my_form = MyForm(initial={'name':request.user.first_name})

Эта форма несвязана. Проверка не запускается, поэтому при визуализации шаблона не будет отображаться никаких ошибок.

Ответ 2

Нет, это не какая разница (и мне было бы интересно узнать, где в документации вы получили это впечатление). Разница заключается в том, выполняется ли проверка.

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

Связанные данные, конечно, запускают проверку. Кроме того, если вы используете модельную форму, соответствующий экземпляр будет обновляться только связанными данными, а не исходными данными.

Ответ 3

Другое отличие состоит в том, что data ожидает, что виджеты могут анализировать, тогда как initial - для каждого поля. Это имеет значение, если вы, например, используйте MultiWidget s. В таком случае data должен содержать что-то вроде

{'myfield_0': 'data for subwidget 0', 
 'myfield_1': 'data for subwidget 1'}

тогда как initial ожидает что-то вроде этого:

{'myfield': 'data for subwidget 0,data for subwidget 1'}