0

我正在尝试使用他们在这里的 django 表单验证演练

但是,我似乎陷入困境。似乎我的一个参数(收件人)没有被传递,即使其他参数是。

这是我的html表单:

<form action= "receiver" method="post" >
{% csrf_token %}
<p><label for="id_subject">Subject:</label>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
<p><label for="id_message">Message:</label>
    <input type="text" name="message" id="id_message" /></p>
<p><label for="id_sender">Sender:</label>
    <input type="text" name="sender" id="id_sender" /></p>
<p><label for="id_recipients">Recipients:</label>
    <input type="text" name="recipients" id="id_recipients" /></p>
<p><label for="id_cc_myself">Cc myself:</label>
    <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>
<input type="submit" value="Submit" />
</form>

这是models.py中的相关模型类:

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    recipients = MultiEmailField(required=True)
    cc_myself = forms.BooleanField(required=False)

这是相关的视图:

def reciever(request):
    form = ContactForm(request.POST) # A form bound to the POST data  
    print form
    if request.method == 'POST':
        if form.is_valid():
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            cc_myself = form.cleaned_data['cc_myself']      
            recipients = form.cleaned_data['recipients']
            template = loader.get_template('helloworld/receiver.html')

            context = RequestContext(request,{
                    'subject':subject,                          
                    'sender':sender,
                    'message': message,
                    'cc_myself': cc_myself,
                    'recipients': recipients,
        })
        return HttpResponse(template.render(context))
    else:
        context = RequestContext(request,{
            'form': form, 
        })
        template = loader.get_template('helloworld/wrong.html')
        return HttpResponse(template.render(context))

我对视图没有过多了解,我可以从我的打印表单中看到请求无效,输出如下:

<tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" maxlength="100" name="subject" type="text" value="slkj" /></td></tr>
<tr><th><label for="id_message">Message:</label></th><td><input id="id_message" name="message" type="text" value="lkjqw" /></td></tr>
<tr><th><label for="id_sender">Sender:</label></th><td><input id="id_sender" name="sender" type="text" value="ij@aol.com" /></td></tr>
**<tr><th><label for="id_recipients">Recipients:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input id="id_recipients" name="recipients" type="text" /></td></tr>**
<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input id="id_cc_myself" name="cc_myself" type="checkbox" /></td></tr>

因此,出于某种原因,即使我确实在表单框 (fake@aol.com) 中输入了信息,但它似乎并没有通过表单,我不太确定为什么。

编辑:对不起,我忘记了一个重要的部分。我还按照教程的说明在 model.py 中添加了一个自定义类:

class MultiEmailField(forms.Field):
    def to_python(self, value):
        "Normalize data to a list of strings."

        # Return an empty list if no input was given.
        if not value:
            return []
        return value.split(',')

    def validate(self, value):
        "Check if value consists only of valid emails."

        # Use the parent's handling of required fields, etc.
        super(MultiEmailField, self).validate(value)

        for email in value:
            validate_email(email)
4

0 回答 0