【问题标题】:Cannot pass variables to Django 3 method from HTML template无法从 HTML 模板将变量传递给 Django 3 方法
【发布时间】:2020-12-13 12:25:09
【问题描述】:

我是一名 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 表单中。

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

urls.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'),
]

views.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.x django django-views django-templates


    【解决方案1】:

    当未找到键 'Name:' 时,您的代码 request.GET.get('Name:', '') 返回空字符串。

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



    详情

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

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

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



    #EDIT1

    您的 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表单提交按钮&lt;input type="submit"&gt;,并将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 表单输入标签。

    【讨论】:

    • 我进行了编辑,但仍然收到一封空电子邮件。我还删除了一些进入其中的临时部分。 ** views.py ** ` name1 = request.GET.get('name', '') email1= request.GET.get('email' , '') msg​​1 = request.GET.get('message1', '')` 看起来我有一个小缓冲区,但是,我还编辑了 html 以去除 { with } 并将变量重命名为 message1。 `
    • 没关系。我将我的问题编辑为当前配置。
    • 我已经更新了我的答案。如果它仍然不起作用,请告诉我
    【解决方案2】:

    太好了。将方法调用移至表单标签效果很好。
    谢谢!你们是最棒的。

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多