0

我在 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,
    })

问题是如果表单没有验证它会返回一个空表单。对于写了长消息但忘记输入自己的名字或其他东西的人来说,这可能是一个很大的烦恼。

我已通过将以下代码更改为 lastelse:来解决此问题:

    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 %}
4

1 回答 1

2

这是一种简单的方法,可以始终使用 POST 数据初始化表单,或者什么都不做:

def contact(request):
    form = ContactForm(request.POST or None)
    if request.POST and form.is_valid():

然后删除你的 else 块。

该表单将始终包含数据,并且如果它只是一个 GET 则不会引发错误。

由于我使用了一些 Python 技巧,请允许我解释一下。

  1. Python 支持表达式中的和/或运算符。
  2. or第一个值返回一个真实值时,评估 python 将停止。
  3. 在评估 时and,如果第一个条件返回 false,Python 将停止。

因此,当我们初始化表单时,我们要求 Python 分配 request.POST 的值(如果它为真),或者None,如果 request.POST 为假(如果它为空,则为假)。当有 POST 时,这会使用 request.POST 中的值正确初始化表单,否则为 None 。

在我们的 if 语句中,如果 request.POST 为假(如果 request.POST 为空,则为假),Python 会停在那里并且从不调用form.is_valid(),因此如果 POST 不存在,我们不必担心验证运行。

整齐吧?

于 2013-03-14T09:26:48.653 回答