2016-11-03 16 views
0

我在服務器中有一個PHP腳本,返回{"available":true}{"available":false},具體取決於電子郵件地址是否可用。這裏是代碼:如何在我的Django表單中提出錯誤?

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

然而,形式要提交的頁面,但它沒有提高驗證錯誤。我究竟做錯了什麼?

+0

我們展示您的視圖代碼 –

+0

@SardorbekImomaliev我沒有寫視圖代碼呢。錯誤應該在視圖運行之前生成,我是否正確? – MiniGunnR

+0

否。表單的驗證是通過視圖調用的。 –

回答

1

如果表單無效,你什麼都不做。當提出ValidationError時,django設置form.errors字典,其中包含有關驗證期間出錯的數據。更多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 }) 
+0

這不是我正在尋找的。它將用戶帶到不同的頁面並顯示我通過執行'return HttpResponseBadRequest('message')'傳遞的消息。我希望用戶被帶回表單並在產生錯誤的文本字段上顯示消息,在這種情況下是電子郵件字段。我在註冊表格中以兩個密碼不匹配的相同方式完成了此操作。但是,這個方法在這裏不起作用。 – MiniGunnR

+1

@MiniGunnR這是因爲這需要在模板中完成。這可能是因爲你正在重定向到家而不是渲染錯誤。在if if form.is_valid()'下移動重定向。看到我更新的答案。另請閱讀https://docs.djangoproject.com/zh/1.10/topics/forms/#rendering-fields-manually –

+0

謝謝。它解決了我的問題。 :) – MiniGunnR

相關問題