У меня есть форма с почтовым свойством.
При использовании {{ form.email }}
в случае некоторой ошибки проверки Django все еще представляет предыдущее значение во входном атрибуте значения тега:
<input type="text" id="id_email" maxlength="75" class="required"
value="some@email.com" name="email">
Я хочу представить вход, отмечают меня (для добавления некоторого кода JavaScript и ошибочного класса в случае ошибки). Например, это - мой шаблон вместо {{ form.email }}
:
<input type="text" autocomplete="on" id="id_email" name="email"
class="email {% if form.email.errors %} error {% endif %}">
Однако это не отображает ошибочное значение (some@email.com
в этом примере) пользователю.
Как я получаю значение поля в шаблоне?
Решение, предложенное Йенсом, является правильным. Однако оказывается, что если вы инициализируете свою ModelForm с помощью экземпляра (пример ниже), django не будет заполнять данные:
def your_view(request):
if request.method == 'POST':
form = UserDetailsForm(request.POST)
if form.is_valid():
# some code here
else:
form = UserDetailsForm(instance=request.user)
Итак, я создал свой собственный базовый класс ModelForm, который заполняет исходные данные:
from django import forms
class BaseModelForm(forms.ModelForm):
"""
Subclass of `forms.ModelForm` that makes sure the initial values
are present in the form data, so you don't have to send all old values
for the form to actually validate.
"""
def merge_from_initial(self):
filt = lambda v: v not in self.data.keys()
for field in filter(filt, getattr(self.Meta, 'fields', ())):
self.data[field] = self.initial.get(field, None)
Тогда простой пример представления выглядит следующим образом:
def your_view(request): if request.method == 'POST':
form = UserDetailsForm(request.POST)
if form.is_valid():
# some code here
else:
form = UserDetailsForm(instance=request.user)
form.merge_from_initial()
У меня есть простое решение для тебя!
{{ form.data.email }}
Я попробовал это и оно сработало. Для этого требуется ваше представление, чтобы заполнить класс формы POST-данными.
Очень простой пример:
def your_view(request):
if request.method == 'POST':
form = YourForm(request.POST)
if form.is_valid():
# some code here
else:
form = YourForm()
return render_to_response('template.html', {'form':form})
Надеюсь, это вам поможет. Если у вас есть вопросы, пожалуйста, дайте мне знать.
Кажется, это работает.
{{ form.fields.email.initial }}