0

我對Django相當陌生,而且我正在處理一個接收用戶信息的頁面。如果所有的信息都是正確的,它將進入下一頁。但是,如果用戶沒有提供所有給定的信息,它將刷新頁面。我的問題是用戶必須填寫相當多的字段,並且如果人員錯過任何字段,我不希望他們必須重新輸入所有內容。所以我的解決方法是在views.py中,我創建了一個字典,並使用模板中的輸入名稱填充字典。但是,當我運行代碼時,它給了我一個錯誤,說我的字典中的值不存在。我現在認爲我的字典實際上並沒有訪問任何模板值。在Django中,如何訪問views.py中的模板值?

這裏是我的模板:

<!DOCTYPE html> 
{% extends "Checklist/base.html" %} 
{% block main_content %} 
{% load static %} 
    <html> 
    <body> 

     <form action="{% url 'Checklist:signin_check' %}" method="post"> 
     {% csrf_token %} 
     <ul style="list-style-type:none"> 
     <li> 
      <label for="driver_first_name">Driver First Name:</label> 
      <input type="text" name="driver_first_name" value="" id="driver_first_name"> 
     </li> 
     <li> 
      <label for="driver_last_name">Driver Last Name:</label> 
      <input type="text" name="driver_last_name" value="" id="driver_last_name"> 
     </li> 
     <li> 
      <label for="driver_wwid">Driver WWID:</label> 
      <input type="text" name="driver_WWID" value="" id="driver_WWID" maxlength="8" 
       onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57"> 
     </li> 

     <li> 
      <label for="co_driver_first_name">CO-Driver First Name:</label> 
      <input type="text" name="co_driver_first_name" value="" id="co_driver_first_name"> 
     </li> 
     <li> 
      <label for="co_driver_last_name">CO-Driver Last Name:</label> 
      <input type="text" name="co_driver_last_name" value="" id="co_driver_last_name"> 
     </li> 
     <li> 
      <label for="co_driver_wwid">CO-Driver WWID:</label> 
      <input type="text" name="co_driver_WWID" value="" id="co_driver_WWID" maxlength="8" 
       onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57"> 
     </li> 
     <li> 
     <input type="submit" value="Continue"> 
     </li> 
     </ul> 
     </form> 

    </body> 
    </html> 
{% endblock %} 

這裏是views.py:

def signin_check(request): 
    driver_info_model = Driver() 
    if request.method == "POST": 
     driver_info_form = Driver_Form(request.POST) 
     c = {'driver_first_name':driver_first_name, 'driver_last_name':driver_last_name, 
      'driver_WWID':driver_WWID, 'co_driver_first_name':co_driver_first_name, 
      'co_driver_last_name':co_driver_last_name, 'co_driver_WWID': co_driver_WWID,} 
     if driver_info_form.is_valid(): 
      driver_info_form.save() 
      return render(request, 'Checklist/checklist.html') 
    template = loader.get_template('Checklist/signin.html') 
    return HttpResponse(template.render(c, request)) 

任何反饋將不勝感激。謝謝!

+0

你應該爲此使用Django表單。 –

回答

0

然而,當我去運行的代碼,它給了我一個錯誤說 在我的字典中的值不存在。我現在認爲我的 字典實際上並未訪問任何模板值。

從你views.py獨自我猜你正在運行的異常是你分配的字典值沒有定義。例如,在'driver_first_name':driver_first_name中,Python正在尋找名爲driver_first_name的變量,但您尚未定義它。您正在尋找的數據,如Justin提到的,可以在requests.POST中找到。

一個解決方案,而更詳細,說明需要做什麼:

def signin_check(request): 
    driver_info_model = Driver() 
    if request.method == "POST": 
     driver_info_form = Driver_Form(request.POST) 
     driver_first_name = request.POST.get('driver_first_name', '') 
     driver_last_name = request.POST.get('driver_last_name', '') 
     driver_WWID = request.POST.get('driver_WWID', '') 
     co_driver_first_name = request.POST.get('co_driver_first_name', '') 
     co_driver_last_name = request.POST.get('co_driver_last_name', '') 
     co_driver_WWID = request.POST.get('co_driver_WWID', '') 
     c = {'driver_first_name': driver_first_name, 
      'driver_last_name': driver_last_name, 
      'driver_WWID': driver_WWID, 
      'co_driver_first_name': co_driver_first_name, 
      'co_driver_last_name': co_driver_last_name, 
      'co_driver_WWID': co_driver_WWID, } 
     if driver_info_form.is_valid(): 
      driver_info_form.save() 
      return render(request, 'Checklist/checklist.html') 
    template = loader.get_template('Checklist/signin.html') 
    return HttpResponse(template.render(c, request)) 

我的問題是,有相當多的領域的用戶已到 填寫,如果對方沒有任何領域,我不希望他們 不得不重新輸入一切。

要解決您的第二個問題,您需要處理您的HTML模板。您的輸入字段值爲"",因此您通過上下文傳遞的任何值都不會達到任何值。幸運的是,你走在正確的道路上,而且你非常接近,所以你只需要填入這些值即可。例如:

<li> 
    <label for="driver_first_name">Driver First Name:</label> 
    <input type="text" name="driver_first_name" value="{{ driver_first_name }}" id="driver_first_name"> 
</li> 

注意{{ driver_first_name }}會引用真實傳遞到上下文driver_first_name

+0

謝謝!但是,將該值添加到「driver_first_name」對我的原因沒有幫助。它所做的只是將「driver_first_name」添加到html模板的文本區域中。但是,當我重新加載頁面時,文本被重置爲默認值。 –

+0

@ZarifAkhtab不客氣,希望我能幫你解決這個問題。爲了澄清,哪個模板是包含文本字段等的模板?我在你的意見中注意到你有兩個可以呈現的模板。 –

0

我不是100%肯定,我是相當新的Django的自己,但是從我以前也做過,你可以從傳遞中,像這樣的請求的POST數據:

request.POST['driver_first_name'] 

如果沒有數據存在或從

request.POST.get('driver_first_name', 'optionaldefaultvalue') 

如果沒有數據存在於指定的字段,或可選的默認返回其中沒有引發錯誤。

它也可能更容易做你Django的內置形式是什麼之後

相關問題