Как я отображаю значение поля формы Django в шаблоне?

У меня есть форма с почтовым свойством.

При использовании {{ 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 в этом примере) пользователю.

Как я получаю значение поля в шаблоне?

70
задан daaawx 26 April 2019 в 03:13
поделиться

4 ответа

Решение, предложенное Йенсом, является правильным. Однако оказывается, что если вы инициализируете свою 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()
5
ответ дан 24 November 2019 в 13:15
поделиться

У меня есть простое решение для тебя!

{{ 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})

Надеюсь, это вам поможет. Если у вас есть вопросы, пожалуйста, дайте мне знать.

14
ответ дан 24 November 2019 в 13:15
поделиться
{{form.fields.email}}
0
ответ дан 24 November 2019 в 13:15
поделиться

Кажется, это работает.

{{ form.fields.email.initial }}
14
ответ дан 24 November 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: