Почему {{ form }} представляет экземпляр формы в файле шаблона?
Согласно django official doc,
Все, что вам нужно сделать, чтобы поместить вашу форму в шаблон, это поместить экземпляр формы в контекст шаблона. Таким образом, если ваша форма в контексте называется form,
{{ form }}
будет отображать ее элементы<label>
и<input>
соответствующим образом.
Где в исходном коде django экземпляр формы назван/определен как form
для контекста шаблона? И как я могу изменить название на что-то другое {{ my_form }}
, например?
При рендеринге представления в Views.py вы можете сделать следующее, чтобы изменить имя формы, которую вы рендерите:
Views.py
from .forms import MyForm1
def MyForm(request):
my_form = Myform1
return render(request , 'MyForm.html' , {'my_form' : my_form})
Затем при вызове вашей формы на HTML-странице вы можете вызвать ее как
{{ my_form }}
Как вы метко сказали в своем комментарии:
Под контекстом понимается хранилище данных, используемых для визуализации с помощью HTML файлы шаблонов.
Что касается того, как form
передается в контекст, если вы используете представление на основе функции, это полностью зависит от вас, с каким ключом вы передаете форму, например, нижеприведенный код будет передавать его как my_form
:
return render(request, 'template.html', {'my_form': my_form})
В случае представления на основе класса большинство из них наследуют от ContextMixin
, который объявляет метод get_context_data
, используемый для передачи переменных в контекст. Все представления на основе классов, которые имеют дело с формами, также наследуются от FormMixin
, глядя на его исходный код он переопределяет get_context_data
для передачи формы в контекст:
def get_context_data(self, **kwargs): """Insert the form into the context dict.""" if 'form' not in kwargs: kwargs['form'] = self.get_form() return super().get_context_data(**kwargs)
Конечно, вы можете решить снова переопределить get_context_data
самостоятельно и передать форму с другим именем, но это будет не очень полезно:
class YourView(CreateView):
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['my_form'] = context['form']
return context