显示模板中的Django表单字段的值?
我有一个电子邮件属性的表单。 在使用{{form.email}}的情况下,如果出现validation错误,django仍会在input标签的value属性中呈现之前的值:
<input type="text" id="id_email" maxlength="75" class="required" value="some@email.com" name="email">
我想自己渲染input标签(在发生错误时添加一些javascript代码和一个错误类)。 例如,这是我的模板,而不是{{form.email}}:
<input type="text" autocomplete="on" id="id_email" name="email" class="email {% if form.email.errors %}error{% endif %}">
但是,这并不显示给用户的错误值(在这个例子中是“some@email.com”)。 如何获取模板中的字段值?
这是一个在Django 1.3中修复的function请求。
这是错误: 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
你可以用模板来做到这一点:
{% if form.instance.some_field %} {{form.instance.some_field}} {% else %} {{form.data.some_field}} {% endif %}
这将显示实例值(如果表单是使用实例创build的,则可以使用initial来代替),否则显示POST数据,例如发生validation错误时。
我有一个简单的解决scheme给你!
{{ 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 }}
延斯提出的解决scheme是正确的。 然而,事实certificate,如果你用一个实例初始化你的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)
所以,我创build了自己的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.field_name.value}}适用于我
我想显示一个formset字段的值。 我总结了这个解决scheme,它也适用于正常的forms:
{% if form.email.data %} {{ form.email.data }} {% else %} {{ form.initial.email }} {% endif %}
上述解决scheme对我来说工作不是很好,我怀疑他们会在前缀表单(例如向导和表单集)的情况下工作。 使用{{ form.data.email }}
的解决scheme不能工作,因为它是一个字典查找,并且带有前缀表单的字段名称看起来像“1-email”(向导和前缀forms)或“form- 1个电子邮件“(formset),减号( – )不允许在虚线模板查找expression式中使用。
{{form.field_name.value}}
只是Django 1.3+。
如果您使用实例填充表单而不是POST数据(如build议的答案所要求),则可以使用{{form.instance.my_field_name}}来访问数据。
{{form.fields.email}}
在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/find它。;
我尝试了一些提到的可能性,这就是我如何解决我的问题:
#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>