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

問題は、フォームが検証されない場合、空のフォームが返されることです。これは、長いメッセージを書いたのに自分の名前などを入れるのを忘れた人にとっては、大きな迷惑になる可能性があります。

以下のコードを次のように変更して修正しましelse:た。

    try:
        form = ContactForm(form.cleaned_data)
    except UnboundLocalError:
        form = ContactForm()

まだ存在しtryないときに、ページの最初のレンダリングのために -statement する必要がありました。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