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的内置形式是什么之后

相关问题