Отображение значения поля формы django в шаблоне?
у меня есть форма со свойством электронной почты. При использовании {{ форма.email }} в случае какой-либо ошибки проверки django по-прежнему отображает Предыдущее значение в атрибуте value входного тега:
<input type="text" id="id_email" maxlength="75" class="required" value="some@email.com" name="email">
Я хочу сам отобразить входной тег (чтобы добавить код javascript и класс ошибок в случае ошибки). Например, это мой шаблон вместо {{ form.Эл. почта }}:
<input type="text" autocomplete="on" id="id_email" name="email" class="email {% if form.email.errors %}error{% endif %}">
однако это не отображает ошибочное значение ("some@email.com" в этом примере) к пользователю. Как получить значение поля в шаблоне?
11 ответов:
это был запрос функции, которая была исправлена в 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()
' s опущены, в то время как в Jinja2 вызовы метода явны.если вы хотите знать, что версия Django вы работаете, он скажет вам, когда вы делаете команду runserver.
если вы находитесь на что-то до 1.3, вы, вероятно, можете использовать исправление, опубликованное в вышеуказанной ошибке:https://code.djangoproject.com/ticket/10427#comment:24
вы можете сделать это из шаблона что-то вроде этого:
{% if form.instance.some_field %} {{form.instance.some_field}} {% else %} {{form.data.some_field}} {% endif %}
это отобразит значение экземпляра (если форма создана с экземпляром, вы можете использовать initial вместо этого, если хотите), или же отобразить данные POST, например, при возникновении ошибки проверки.
у меня есть простое решение для вас!
{{ 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})
надеюсь, что это поможет вам. Если у вас есть любые вопросы, пожалуйста, дайте мне знать.
решение, предложенное Йенсом, является правильным. Однако оказывается, что если вы инициализируете свою модель с помощью экземпляр (пример ниже) 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()
Я хотел отобразить значение поля набора форм. Я заключил это решение, которое должно работать и для нормальных форм:
{% 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+.
Если вы заполнили форму экземпляром, а не данными POST (как требует предлагаемый ответ), вы можете получить доступ к данным с помощью {{ form.instance.my_field_name }}.
я попробовал несколько из упомянутых возможностей, и вот как я решил свою проблему:
#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>
на Django 1.2, {{ формы.данные.поле }} и {{ форма.поле.данные }} все в порядке, но не {{ форма.поле.значение.}}
Как говорили другие, {{ форма.поле.значение }} - это только Django 1.3+, но в нет спецификации https://docs.djangoproject.com/en/1.3/topics/forms/. его можно найти в https://docs.djangoproject.com/en/1.4/topics/forms/.