我有一个带有电子邮件属性的表格。
在出现某些验证错误的情况下使用 {{ form.email }}
时,Django 仍会在输入标记的 value 属性中呈现先前的值:
<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
)。
如何在模板中获取字段的值?
这是 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
您可以使用以下模板从模板中执行此操作:
{% if form.instance.some_field %}
{{form.instance.some_field}}
{% else %}
{{form.data.some_field}}
{% endif %}
这将显示实例值(如果表单是使用实例创建的,您可以根据需要使用 initial 代替),或者在发生验证错误时显示 POST 数据。
这似乎有效。
{{ form.fields.email.initial }}
我有一个简单的解决方案给你!
{{ 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.field_name.value }}
适合我
Jens 提出的解决方案是正确的。然而,事实证明,如果你用一个实例(下面的例子)初始化你的 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()
我尝试了一些提到的可能性,这就是我解决问题的方法:
#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>
如果您使用实例而不是 POST 数据填充表单(如建议的答案所要求的那样),则可以使用 {{ form.instance.my_field_name }} 访问数据。
我想显示一个表单集字段的值。我总结了这个解决方案,它也适用于正常形式:
{% if form.email.data %} {{ form.email.data }}
{% else %} {{ form.initial.email }}
{% endif %}
上述解决方案对我来说效果不佳,我怀疑它们是否适用于前缀表单(例如向导和表单集)。使用 {{ form.data.email }}
的解决方案不起作用,因为它是字典查找,并且使用前缀表单,您的字段名称看起来像“1-email”(向导和前缀表单)或“form-1-email”(表单集),并且在点分模板查找表达式中不允许使用减号 (-)。
{{form.field_name.value}}
仅适用于 Django 1.3+。
对于复选框及其项目:
{% for item in people.q %}
<div class="form-check form-switch ">
<label class="form-check-label" for="{{ item.id_for_label }}">{{ item.data.label }}</label>
<input class="form-check-input" type="checkbox" id="{{ item.id_for_label }}" value="{{ item.data.value }}">
</div>
{% endfor %}
q 是字段名。
在 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/ 中找到。
{{form.fields.email}}
不定期副业成功案例分享
form.field.value
是None
,则将显示文本“None”。要改为显示空字符串,请使用{{ form.field.value|default_if_none:"" }}
{{ form.initial.fieldname }}
(Django 1.2.3)。