我如何在我的Django表单中引发一个错误?


How can I raise an error in my Django form?

我在服务器中有一个PHP脚本,根据电子邮件地址是否可用返回{"available":true}{"available":false}。下面是代码:

<?php
$servername = "localhost";
$username = "root";
$password = "mysqlpass";
$dbname = "testdb";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT username FROM testtable";
$result = $conn->query($sql);
$query = $_GET['query'].'@groupdesignace.com';
$arr = array();
if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
    $arr[] = $row['username'];
    }
    if (in_array($query, $arr)) {
    $output = array('available' => false);
    echo json_encode($output);
    } else {
    $output = array('available' => true);
    echo json_encode($output);
    }
} else {
    echo "0 results";
}
$conn->close();
?>

在另一个服务器上,用户通过表单请求他们的电子邮件地址,我使用Django。我写了以下代码检查邮件是否可用,如果不可用,应该会报错。下面是代码:

class RequestEmailAddressForm(forms.Form):
    email = forms.CharField(label='Email', max_length=100)
    password = forms.CharField(widget=forms.PasswordInput)
    def clean_email(self):
        email = self.cleaned_data.get('email')
        if email:
            import requests
            payload = {'query': email}
            r = requests.get('http://172.16.16.172/check_email.php', params=payload)
            result = r.json()
            print r.url
            status = result['available']
            if status == False:
                raise forms.ValidationError('This login name is unavailable!')
        return email

下面是我处理表单的视图:

def request_email_address(request):
    if request.method == "POST":
        form = RequestEmailAddressForm(request.POST)
        if form.is_valid():
            data = form.cleaned_data
            # do something here
        else:
            pass
        return HttpResponseRedirect('/core/home/')
    else:
        form = RequestEmailAddressForm()
    return render(request, "core/request_email_address.html", { "form": form })

但是,表单将转到提交的页面,但没有引发验证错误。我做错了什么?

如果表单无效,您没有做任何事情。当ValidationError被抛出时,django设置form.errors dict,其中包含验证过程中出错的数据。阅读更多https://docs.djangoproject.com/en/1.10/ref/forms/validation/

def request_email_address(request):
    if request.method == "POST":
        form = RequestEmailAddressForm(request.POST)
        if form.is_valid():  # <- form validation is called on this line
            data = form.cleaned_data
            # do something here
            # do redirect here
            return HttpResponseRedirect('/core/home/')
        else:
            pass   
    else:
        form = RequestEmailAddressForm()
    return render(request, "core/request_email_address.html", { "form": form })