it-swarm.com.ru

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

У меня есть форма со свойством электронной почты . При использовании {{form.email}} в случае некоторой ошибки проверки, Django по-прежнему отображает предыдущее значение в атрибуте значения входного тега:

<input type="text" id="id_email" maxlength="75" class="required" value="[email protected]" name="email">

Я хочу сделать входной тег самостоятельно (чтобы добавить код JavaScript и класс ошибок в случае ошибки). Например, это мой шаблон вместо {{form.email}}:

<input type="text" autocomplete="on" id="id_email" name="email" class="email {% if form.email.errors %}error{% endif %}">

Однако это не отображает ошибочное значение (в данном примере «[email protected]») пользователю . Как я могу получить значение поля в шаблоне?

63
Eran Kampf

Решение, предложенное Йенсом, является правильным. Однако, получается, что если вы инициализируете свою ModelForm с помощью instance (пример ниже), 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
Eran Kampf

Этот запрос был исправлен в 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

111
mlissner

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

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

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

39
LeeMobile

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

{{ form.fields.email.initial }}
13
Rich

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

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

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

13
Jens

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

5
robertzp

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

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

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

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

2
kosii

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

1
monofonik

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

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

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

<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>
1
Emmanuel Caster
{{form.fields.email}}
0
shanyu

В 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/ .

0
bigwind