Как отобразить значение поля формы Django в шаблоне? - PullRequest
68 голосов
/ 10 февраля 2010

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

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

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

Ответы [ 11 ]

114 голосов
/ 20 декабря 2011

Этот запрос был исправлен в Django 1.3.

Вот ошибка: https://code.djangoproject.com/ticket/10427

Обычно, если вы запускаете что-то после 1.3, в шаблонах Django вы можете сделать:

{{ form.field.value|default_if_none:"" }}

Или в Jinja2:

{{ form.field.value()|default("") }}

Обратите внимание, что field.value() - это метод, но в шаблонах Django () опущены, а в Jinja2 вызовы методов являются явными.

Если вы хотите узнать, какую версию Django вы используете, она сообщит вам, когда вы выполните команду runserver.

Если вы используете что-то до версии 1.3, вы, вероятно, можете использовать исправление, опубликованное в приведенной выше ошибке: https://code.djangoproject.com/ticket/10427#comment:24

40 голосов
/ 20 января 2011

Вы можете сделать это из шаблона примерно так:

{% if form.instance.some_field %}
      {{form.instance.some_field}}
{% else %}
      {{form.data.some_field}}
{% endif %}

Это отобразит значение экземпляра (если форма создана с экземпляром, вы можете использовать вместо него начальный, если хотите), либо отобразить данные POST, например, когда возникает ошибка проверки.

14 голосов
/ 21 апреля 2010

Это похоже на работу.

{{ form.fields.email.initial }}
13 голосов
/ 10 февраля 2010

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

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

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

5 голосов
/ 04 октября 2011

{{form.field_name.value}} у меня работает

5 голосов
/ 20 февраля 2010

Решение, предложенное Йенсом, является правильным. Однако оказывается, что если вы инициализируете свою 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()
2 голосов
/ 19 января 2017

Я попробовал несколько из упомянутых возможностей, и вот как я решил свою проблему:

#forms.py
class EditProfileForm(forms.ModelForm):
    first_name = forms.CharField(label='First Name',
                                 widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    last_name = forms.CharField(label='Last Name',
                                 widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    # username = forms.CharField(widget=forms.TextInput(
    #                              attrs={'class': 'form-control'}),
    #                              required=True)
    address = forms.CharField(max_length=255, widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    phoneNumber = forms.CharField(max_length=11,
                                 widget=forms.TextInput(
                                 attrs={'class': 'form-control'}),
                                 required=False)
    photo = forms.ImageField(label='Change Profile Image', required=False)

    class Meta:
        model = User
        fields = ['photo', 'first_name', 'last_name', 'phoneNumber', 'address']
                  # 'username',



#views.py
def edit_user_profile(request, username):
    user = request.user
    username = User.objects.get(username=username)
    user_extended_photo = UserExtended.objects.get(user=user.id)
    form = EditProfileForm(request.POST or None, request.FILES, instance=user)
    user_extended = UserExtended.objects.get(user=user)
    if request.method == 'POST':
        if form.is_valid():
            # photo = UserExtended(photo=request.FILES['photo'] or None, )
            user.first_name = request.POST['first_name']
            user.last_name = request.POST['last_name']
            user_extended.address = request.POST['address']
            user_extended.phoneNumber = request.POST['phoneNumber']
            user_extended.photo = form.cleaned_data["photo"]
            # username = request.POST['username']
            user_extended.save()
            user.save()

            context = {
                'form': form,
                'username': username,
                'user_extended_photo': user_extended_photo,
            }

            return render(request, 'accounts/profile_updated.html', context)
    else:
        photo = user_extended.photo
        first_name = user.first_name
        last_name = user.last_name
        address = user_extended.address
        phoneNumber = user_extended.phoneNumber
        form = EditProfileForm(
            initial={'first_name': first_name, 'last_name': last_name,
                                   'address': address, 'phoneNumber': phoneNumber,
                                   'photo': photo})
    context = {
        'form': form,
        'username': username,
        'user_extended_photo': user_extended_photo,

    }
    return render_to_response('accounts/edit_profile.html', context,
                                 context_instance=RequestContext(request))

#edit_profile.html
  <form action="/accounts/{{ user.username }}/edit_profile/" method="post" enctype='multipart/form-data'>
                                    {% csrf_token %}
                                        <div class="col-md-6">
                                            <div class="form-group">
                                                {{ form.as_p }}
                                            </div>
                                        </div>
                                    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
                                    <button type="submit"  value="Update Profile" class="btn btn-info btn-fill pull-right">Update Profile</button>
                                    <div class="clearfix"></div>
                                </form>

Я пытаюсь объяснить это таким образом, чтобы новичкам было легче понять. Обратите особое внимание на else:

        photo = user_extended.photo
        first_name = user.first_name
        last_name = user.last_name
        address = user_extended.address
        phoneNumber = user_extended.phoneNumber
        form = EditProfileForm(
            initial={'first_name': first_name, 'last_name': last_name,
                                  'address': address, 'phoneNumber': phoneNumber,
                                  'photo': photo}) 

Это то, что получает значение attrib, например ::100100

<p><label for="id_first_name">First Name:</label> <input class="form-control" id="id_first_name" name="first_name" type="text" value="Emmanuel" /></p>
<p><label for="id_last_name">Last Name:</label> <input class="form-control" id="id_last_name" name="last_name" type="text" value="Castor" /></p>
2 голосов
/ 12 декабря 2011

Я хотел отобразить значение поля формы.Я пришел к выводу, что это решение должно работать и для обычных форм:

{% if form.email.data %} {{ form.email.data }}
{% else %} {{ form.initial.email }} 
{% endif %}

Вышеуказанные решения не сработали для меня, и я сомневаюсь, что они будут работать в случае префиксных форм (таких как мастераFormSets).Решения, использующие {{ form.data.email }}, не могут работать, потому что это поиск по словарю, а с префиксными формами ваше имя поля будет выглядеть примерно как «1-email» (мастер и префиксная форма) или «form-1-email» (formset) и знак минус (-) недопустимы в точечных выражениях поиска шаблонов.

{{form.field_name.value}} только для Django 1.3+.

1 голос
/ 18 ноября 2010

Если вы заполнили форму экземпляром, а не данными POST (как того требует предложенный ответ), вы можете получить доступ к данным, используя {{form.instance.my_field_name}}.

0 голосов
/ 28 июня 2013

В Django 1.2 {{form.data.field}} и {{form.field.data}} все в порядке, но не {{form.field.value}}.
Как говорили другие, {{form.field.value}} только для Django 1.3+, но в https://docs.djangoproject.com/en/1.3/topics/forms/. нет спецификации. Его можно найти в https://docs.djangoproject.com/en/1.4/topics/forms/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...