首页 > 解决方案 > 无法从 HTML 模板将变量传递给 Django 3 方法

问题描述

我是一名 Django 新手,正在尝试将现有的基于 HTML 的网站转换为 Django 3。此页面中唯一复杂的部分是调用使用该django.core.mail包的 Django 方法,并且一切正常,但是,我正在尝试提取一些数据关闭 HTML 模板并将其传递给此方法。

该方法有效,只是它发送一封空白电子邮件。我正在尝试传递最终用户将在表单上填写的联系信息。如果我将数据硬编码到它工作的方法中。

我曾尝试通过 传递数据urls.py,但是,当我调用该方法时,我尝试的所有内容都无法解析。当我使用request.GET.get一切似乎工作时,只是没有数据。

我希望在方法中使用类似于 JQuery 的东西,如下所示。

    name = str(request.GET.get('Name:', '').strip())
    email = str(request.GET.get('Email:', '').strip())
    msg1 = str(request.GET.get('Message:', '').strip())

字段位于 HTML 表单中。

我将在下面包含一些相关的配置项。

网址.py

from django.urls import path
from django.conf import settings
from django.conf.urls import url
from django.conf.urls.static import static

from . import views

app_name = 'willdoit'

urlpatterns = [
    path('', views.index),
    #url(r'^contact/(?P<name>\.+)/(?P<email>\.+)/(?P<msg1>\.+)/?$', views.contact, name='contact'),
    path('contact/', views.contact, name='contact'),
]

视图.py

def contact(request):

    name1 = request.GET.get('name', '')
    email1= request.GET.get('email', '')
    msg1 = request.GET.get('message1', '')


    subject = 'Work needed'
    from_email = settings.DEFAULT_FROM_EMAIL
    message = name + '   ' + email + '   '  + msg1
    recipient_list = ['pkustra914@gmail.com']


    send_mail(subject, message, from_email, recipient_list, fail_silently=False)

    return HttpResponse('Success')

相关 HTML 模板部分

<div class="contact_content">
                  <div class="col-md-6 col-sm-6 col-xs-12">
                    <div class="contact_message wow fadeInLeft" data-wow-duration="1.5s">
                      <form action="#" id="formid">
                      <form action="#" id="formid">
                  <div class="form-group"> <input class="form-control" name="name"
                placeholder="Name" required="" type="text"> </div>
                  <div class="form-group"> <input class="form-control" name="email" 
                 placeholder="Email" required="" type="email"> </div>
                        <div class="form-group">

            <div class="Descrizione"> <label for="InserisciDescrizione"
                              class=""><b>Message</b></label> <textarea class="form-control"
                                    id="message" placeholder="Type message:" name="message1" rows="6" cols="50" 
title="Message"></textarea> </div>
            <a id="submit" href="{% url 'willdoit:contact' %}" class="btn btn-primary">Submit</a>


我更喜欢使用该request.GET.get方法,但是,有更多的文档通过 url 传递它。

谢谢。

标签: python-3.xdjangodjango-viewsdjango-templates

解决方案


找不到密钥时,您的代码request.GET.get('Name:', '')将返回空字符串。'Name:'

要解决此问题,请request.GET.get('name', '') request.GET.get('email', '') request.GET.get('message', '')改用。



细节

我看到您毫无用处地使用了带有模板的标签。以下代码行不会将名称属性字符串更改为 PascalCase。使用模板标签查看( Docs )

{% with Name=name Email=email Message=message %}

即使它有效,您的代码也应该调用request.GET.get('Name', '')而不是request.GET.get('Name:', ''). 但它不起作用,因为不会修改 GET 请求中的属性名称。



#编辑1

您的 html 代码中显然存在更多错误。我已经重新格式化了您的代码并列出了一些明显的错误。

<!--REFORMATTED CODE-->
<form action="#" id="formid"> <--------------DUPLICATES, remove one
<form action="#" id="formid"> <--------------DUPLICATES, remove one
  <div class="form-group"> <input class="form-control" name="name"
      placeholder="Name" required="" type="text"> </div>
  <div class="form-group"> <input class="form-control" name="email" 
      placeholder="Email" required="" type="email"> </div>
  <div class="form-group">
    <div class="Descrizione">
      <label for="InserisciDescrizione" class=""><b>Message</b></label>
      <textarea class="form-control" id="message"
          placeholder="Type message:" name="message1" rows="6" cols="50" 
          title="Message"></textarea>
    </div>
    <a id="submit" href="{% url 'willdoit:contact' %}"
        class="btn btn-primary">Submit</a>
  <-------- MISSING DIV END TAG
<-------- MISSING FORM END TAG

此外,您使用以下代码直接通过 url 调用服务器:

<a id="submit" href="{% url 'willdoit:contact' %}" class="btn btn-primary">Submit</a>

这不会告诉页面您要提交哪个表单(存在多个表单的情况)。

你有两个选择:

  1. 将标签替换为标准的html表单提交按钮<input type="submit">,并将url添加到表单的action属性中。使用以下代码执行此操作:

     <form action="{% url 'willdoit:contact' %} id="formid">
       ...
         ...
         <input id="submit" type="submit" class="btn btn-primary" value="Submit"/>
     </form>
    

    该解决方案默认使用 GET 方法向服务器发送请求,您将能够通过调用request.GET.get(name).

  2. 如果您使用的是 JQuery,则可以将其替换为以下内容:

    <a href="{% url 'willdoit:contact' %}" onclick="$(this).closest('form').submit()">Submit</a>
    

    但是,不建议这样做。请使用标准 html 表单输入标签作为提交按钮。


推荐阅读