Django之提交表单与前后端交互的方法

当我们在开发一个基于Django的Web应用时,提交表单和前后端交互是非常关键的环节,下面是提交表单与前后端交互的方法的完整攻略。

设置表单

  1. 创建一个表单类,该类必须继承自Django的forms.Formmodelforms.ModelForm,并声明表单所需要的字段。

示例代码:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)
  1. 在视图函数中使用表单实例化,将数据传递给模板并渲染:

示例代码:

from django.shortcuts import render, redirect
from django.core.mail import send_mail
from django.template.loader import get_template
from django.template import Context

from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 获取表单数据
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            cc_myself = form.cleaned_data['cc_myself']

            # 发送邮件
            recipients = ['youremail@example.com']
            if cc_myself:
                recipients.append(sender)
            send_mail(subject, message, sender, recipients)

            # 返回成功信息
            return redirect('success')
    else:
        form = ContactForm()

    return render(request, 'contact.html', {'form': form})

前后端交互

Ajax

  1. 安装jQuery库

示例代码:

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
  1. 在模板文件中添加一个表单

示例代码:

<form method="post" id="contact-form" action="{% url 'contact' %}">
    {% csrf_token %}
    <div class="form-group">
        <label for="subject">Subject</label>
        <input type="text" name="subject" id="subject" class="form-control">
    </div>
    <div class="form-group">
        <label for="message">Message</label>
        <textarea name="message" id="message" class="form-control"></textarea>
    </div>
    <div class="form-group">
        <label for="sender">Sender</label>
        <input type="email" name="sender" id="sender" class="form-control">
    </div>
    <div class="form-check">
        <input type="checkbox" name="cc_myself" id="cc_myself" class="form-check-input">
        <label for="cc_myself" class="form-check-label">Send a copy to myself</label>
    </div>

    <button type="submit" class="btn btn-primary">Submit</button>
</form>
  1. 编写JavaScript代码,使用jQuery库通过Ajax发送表单数据:

示例代码:

$('#contact-form').submit(function(event) {
    event.preventDefault();
    var subject = $('#subject').val();
    var message = $('#message').val();
    var sender = $('#sender').val();
    var cc_myself = $('#cc_myself').is(':checked');

    $.ajax({
        url: $(this).attr('action'),
        type: "POST",
        data: {
            'subject': subject,
            'message': message,
            'sender': sender,
            'cc_myself': cc_myself,
            'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()
        },
        dataType: "json",
        success: function(data) {
            alert(data.message);
        },
        error: function(xhr, errmsg, err) {
            console.log(xhr.status + ": " + xhr.responseText);
        }
    });
});

Fetch API

  1. 在视图函数中使用JSONResponse序列化表单数据

示例代码:

from django.http import JsonResponse

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 获取表单数据
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            cc_myself = form.cleaned_data['cc_myself']

            # 发送邮件
            recipients = ['youremail@example.com']
            if cc_myself:
                recipients.append(sender)
            send_mail(subject, message, sender, recipients)

            # 返回JSONResponse
            return JsonResponse({'message': 'Your message has been sent successfully.'})
    else:
        form = ContactForm()

    return render(request, 'contact.html', {'form': form})
  1. 编写JavaScript代码,使用Fetch API发送表单数据

示例代码:

const form = document.querySelector('#contact-form');

form.addEventListener('submit', function(event) {
    event.preventDefault();
    const subject = form.querySelector('#subject').value;
    const message = form.querySelector('#message').value;
    const sender = form.querySelector('#sender').value;
    const cc_myself = form.querySelector('#cc_myself').checked;

    fetch('{% url "contact" %}', {
        method: 'POST',
        body: JSON.stringify({
            'subject': subject,
            'message': message,
            'sender': sender,
            'cc_myself': cc_myself,
            'csrfmiddlewaretoken': document.querySelector('input[name="csrfmiddlewaretoken"]').value
        }),
        headers: {
            'Content-Type': 'application/json'
        }
    })
    .then(res => res.json())
    .then(data => alert(data.message))
    .catch(error => console.log('Error:', error));
});

在完成这些步骤后,您的Django应用程序就可以支持表单提交和前后端交互了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django之提交表单与前后端交互的方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 华为C8816怎样申请官方解锁码和一键解锁

    华为C8816怎样申请官方解锁码和一键解锁攻略 什么是官方解锁码? 官方解锁码是指厂商(如华为、小米等)提供的一种解锁手机 bootloader 的解锁码。通常情况下,手机的 bootloader 是由厂商加密的,无法直接修改系统文件。而通过解锁 bootloader,就可以进入到手机的刷机模式,安装第三方ROM等操作。 一、如何申请官方解锁码? 官方解锁码…

    C 2023年5月23日
    00
  • 详解Matlab如何绘制小提琴图

    让我给大家详细讲解一下“详解Matlab如何绘制小提琴图”的完整攻略。在此之前,请确保你已经安装了Matlab软件。 首先,我们需要了解什么是小提琴图。小提琴图(Violin Plot)是一种可视化方式,它能够同时显示数据的分布情况和概率密度。小提琴图可以展示出不同数据之间的差异,同时还能显示出数据的整体分布情况和密度。接下来,我将详细介绍如何使用Matla…

    C 2023年5月23日
    00
  • C语言 strrchr()函数

    C语言strrchr()函数使用攻略 1. 介绍 C语言中的strrchr()函数用于查找字符串中最后一次出现某个字符的位置,即在一个字符串中从后向前查找第一次出现指定字符的位置。strrchr()函数在头文件string.h中声明,函数原型为: char *strrchr(const char *s, int c); 2. 参数 strrchr()函数的参…

    C 2023年5月9日
    00
  • windows系统提示不是内部或外部命令也不是可运行的程序的解决办法

    Windows系统提示不是内部或外部命令也不是可运行的程序的解决办法 当我们在Windows系统中使用命令行或运行可执行文件时,可能会遇到”不是内部或外部命令,也不是可运行的程序”的提示。这通常是因为系统无法找到我们输入的命令或可执行文件所在的路径。下面,我们将详细介绍如何解决这个问题。 常见原因 命令或可执行文件路径错误:Windows系统在使用命令行或执…

    C 2023年5月23日
    00
  • C++ Futures与Promises线程使用示例讲解

    C++ Futures与Promises是一种线程模型,用于异步操作的处理和结果的返回。在许多情况下,异步操作可以显著提高程序的性能和响应能力。本文将介绍如何使用C++ Futures与Promises实现异步操作。下面我们通过两个示例来了解C++ Futures与Promises的使用。 示例一 假设我们需要统计一个文本文件中某个单词出现的次数。由于文本文…

    C 2023年5月22日
    00
  • python与C、C++混编的四种方式(小结)

    Python与C、C++混编的四种方式(小结) Python与C/C++混合编程在实际开发中有很高的应用价值,可以用于加速Python程序的执行速度以及与底层硬件交互等需求。有以下四种方式实现Python与C/C++混合编程: 1. 使用ctypes ctypes是Python的一种外部函数库,用于调用动态链接共享库中的函数。它在不需要对应的C代码的情况下可…

    C 2023年5月23日
    00
  • 微信小程序使用uni-app开发小程序及部分功能实现详解

    微信小程序使用uni-app开发小程序及部分功能实现详解 一、uni-app简介 uni-app是DCloud提供的一款跨平台开发框架,可以通过一套代码在不同平台上运行(H5、小程序、APP)。该框架采用Vue.js作为前端开发框架,并提供了一系列的API和插件,让程序开发更加简单。 二、微信小程序使用uni-app开发 1. 安装uni-app 在命令行工…

    C 2023年5月23日
    00
  • QT5连接MySQL实现增删改查

    下面就是QT5连接MySQL实现增删改查的完整攻略。 1. 安装MySQL驱动 在QT5中连接MySQL必须要安装MySQL驱动,你可以从以下链接中下载:https://www.mysql.com/products/connector/ 将下载好的驱动放在QT5安装目录下的plugins/sqldrivers目录下。 2. 配置项目文件 在.pro文件中添加…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部