我在Django文档的帮助下写了这个联系表单:
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['name@e-mail.com']
if cc_myself:
recipients.append(sender)
m = '%s\n\n-----------------\n%s' % (message, name)
from django.core.mail import send_mail
send_mail(subject, m, sender, recipients)
return HttpResponseRedirect('/kontakt/tack/')
else:
form = ContactForm()
return render(request, 'contact/index.html', {
'form': form,
})
问题是如果表单没有验证,则返回一个空表单。对于那些写了很长信息却忘了把他的名字放进去的人来说,这可能是一个很大的烦恼。
我通过将以下代码更改为上一个else:
来修复此问题:
try:
form = ContactForm(form.cleaned_data)
except UnboundLocalError:
form = ContactForm()
当需要try
时,我需要form.cleaned_data
- 首次呈现页面的语句。这有效,但看起来像是一个相当难看的黑客。
在没有我丑陋的try-except解决方案的情况下重新渲染表单时,是否有一些标准方法可以使用之前填写的文本?
{% block content %}
<div id="contact-generic-container">
<p>Lorem ipsum (not really, but ain't relevant).</p>
</div> <!-- #contact-generic-container -->
<div id="contact-form" class="clearfix">
<br/>
<h2>Kontakta oss!</h2>
<form action="/kontakt/" method="post">
{{ form.non_field_errors }}
<fieldset class="text">
{% csrf_token %}
<div class="field-wrapper">
<label for="id_name">Namn:</label>
{{ form.name }}
{{ form.name.errors }}
</div>
<div class="field-wrapper">
<label for="id_sender">E-post:</label>
{{ form.sender }}
{{ form.sender.errors }}
</div>
<div class="field-wrapper">
<label for="id_subject">Ämne:</label>
{{ form.subject }}
{{ form.subject.errors }}
</div>
</fieldset>
<fieldset class="text">
<div class="field-wrapper">
<label for="id_message">Meddelande:</label><br/>
{{ form.message }}
{{ form.message.errors }}
</div>
<div class="field-wrapper">
<label for="id_cc_myself">Kopia till mig själv:</label>
{{ form.cc_myself }}
{{ form.cc_myself.errors }}
</div>
<input type="submit" value="Skicka" />
<fieldset class="text">
</form>
</div>
{% endblock %}
答案 0 :(得分:2)
这是一种总是使用POST数据初始化表单的简单方法,或者什么都不是:
def contact(request):
form = ContactForm(request.POST or None)
if request.POST and form.is_valid():
然后删除你的其他阻止。
表单中总会有数据,如果只是GET,则不会抛出错误。
由于我正在使用一些Python技巧,请允许我解释一下。
or
python将停止。and
时,如果第一个条件返回false,Python将停止。因此,当我们初始化表单时,我们要求Python分配request.POST的值(如果它是真的),或者None
,如果request.POST为false(如果它是空的,它将是)。当有POST时,这会在request.POST中正确显示值,否则为None。
在我们的if语句中,如果request.POST为false(如果request.POST为空则将为空),Python停在那里并且从不调用form.is_valid()
,因此我们不必担心运行验证如果POST不存在。
干嘛?