Era*_*mpf 70 django django-templates
我有一个带有电子邮件属性的表单.在出现某些验证错误的情况下使用{{form.email}}时,django仍会在输入标记的value属性中呈现前一个值:
<input type="text" id="id_email" maxlength="75" class="required"
value="some@email.com" name="email">
Run Code Online (Sandbox Code Playgroud)
我想自己渲染输入标记(以便在出现错误时添加一些javascript代码和错误类).例如,这是我的模板,而不是{{form.email}}:
<input type="text" autocomplete="on" id="id_email" name="email"
class="email {% if form.email.errors %} error {% endif %}">
Run Code Online (Sandbox Code Playgroud)
但是,这不会向用户显示错误值(在此示例中为"some@email.com").如何在模板中获取字段的值?
mli*_*ner 118
这是一个在Django 1.3中修复的功能请求.
这是错误:https://code.djangoproject.com/ticket/10427
基本上,如果你在1.3之后运行某些东西,在Django模板中你可以这样做:
{{ form.field.value|default_if_none:"" }}
Run Code Online (Sandbox Code Playgroud)
或者在Jinja2:
{{ form.field.value()|default("") }}
Run Code Online (Sandbox Code Playgroud)
注意,这field.value()
是一个方法,但是在Django模板()
中省略了,而在Jinja2中,方法调用是显式的.
如果你想知道你正在运行什么版本的Django,它会告诉你何时执行runserver命令.
如果您使用的是1.3之前的某些内容,您可以使用上述错误中发布的修补程序:https://code.djangoproject.com/ticket/10427#comment:24
Lee*_*ile 40
您可以使用以下内容从模板执行此操作:
{% if form.instance.some_field %}
{{form.instance.some_field}}
{% else %}
{{form.data.some_field}}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
这将显示实例值(如果表单是使用实例创建的,则可以根据需要使用initial),或者显示POST数据,例如发生验证错误时.
Ric*_*ich 15
这似乎有效.
{{ form.fields.email.initial }}
Run Code Online (Sandbox Code Playgroud)
Jen*_*ens 14
我有一个简单的解决方案!
{{ form.data.email }}
Run Code Online (Sandbox Code Playgroud)
我试过这个并且它有效.这需要您的视图使用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})
Run Code Online (Sandbox Code Playgroud)
希望对你有所帮助.如果您有任何疑问,请告诉我.
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)
Run Code Online (Sandbox Code Playgroud)
所以,我创建了自己的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)
Run Code Online (Sandbox Code Playgroud)
然后,简单视图示例如下所示:
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()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
120260 次 |
最近记录: |