我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python Django框架中表单的用法详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python Django框架中表单的用法详解

Django保证表单的正确显示需要添加CSRF(防止网站跨站请求伪造而默认开启的一种保护方式),在<form></form>之间添加

{% csrf_token %}

在项目settings.py中 * ‘django.middleware.csrf.CsrfViewMiddleware’, * 引入,如果没有此中间件,手动添加。

文件上传

首次打开路径是GET请求,如果点击上传是POST请求,如果文件内容不为空,则上传文件,上传路径为主项目下的 media/uploads/,如果路径不存在则新建。open(os.path.join(path + myFile.name), ‘wb+’) 二进制读写打开对应文件,chunks()将文件分块读写。

def upload_file(request):
    if request.method == "GET":
        return render(request, 'app1/upload.html')
    if request.method == "POST":
        myFile = request.FILES.get("myfile", None)
        if myFile:
            path = 'media/uploads/'
            if not os.path.exists(path):
                os.makedirs(path)
            dest = open(os.path.join(path + myFile.name), 'wb+')
            for chunk in myFile.chunks():
                dest.write(chunk)
            dest.close()
            return HttpResponse("上传完成")
        else:
            return HttpResponse("没有上传文件")

添加路由。

文件已经上传成功。

Form表单

如下新建一个form.py写入如下代码

from django import forms

class UserInfoForm(forms.Form):
    '''用户状态'''
    STATUS = ((None, '请选择'), (0, '正常'), (1, '无效'),)
    username = forms.CharField(label="用户名称", min_length=6, widget=forms.widgets.TextInput(
        attrs={'class': 'form-control', 'placeholder': '请输入用户名称'}
    ))
    password = forms.CharField(label="密码", min_length=6, max_length=10, widget=forms.widgets.PasswordInput(
        attrs={'class': 'password'}, render_value=True
    ))
    age = forms.IntegerField(label="年龄", initial=1)
    mobile = forms.IntegerField(label="手机号码")
    status = forms.ChoiceField(label="用户状态", choices=STATUS)
    createdate = forms.DateTimeField(label="创建时间", required=False)

表单字段

表单字段说明
CharField文本输入
InterField/FloatField/DecimalField数值输入
ChoiceField选择输入框 choices指定下拉列表
FileField文件
BooleanField复选框
DateField/DateTimeField/TimeField时间输入框,可以设置输入格式 input_format=[“%Y-%m-%d %H:%M”]
EmailField邮件输入框
URLField路劲输入框
ModelChoiceField从数据库获取下拉列表

字段参数

字段说明
labellabel标签
label_suffixLabel标签统一后缀信息
initial初始值
help_text字段描述信息
error_messages字段描述信息
validators验证规则
required是否必须
disabled字段是否可编辑
widget指定HTML样式

widget参数

参数说明
PasswordInput密码输入框
HiddenInput隐藏元素
Textarea文本域
CheckboxInput复选框
FileInput文件输入框
RadioSelect单选按钮
DateTimeInput时间输入框
Select下拉列表
SelectMuitiple多选框

配置视图和路径显示对应表单

app1下的views.py

def userinfo_form(request):
    if request.method == "GET":
        myForm = UserInfoForm()

        return render(request, 'app1/userinfo.html', {'form_obj': myForm})

userinfo.html

<html>
  <head></head>
  <body>
    <form action="" method="POST">
      {% csrf_token %} {{ form_obj.as_p }}
      <input type="submit" value="提交" />
    </form>
  </body>
</html>

  • as_p 为表单提供<p>标签
  • as_table 为表单提供<table>标签
  • as_ui 为表单提供<ui>标签

以上用了as_p,故源代码显示p标签。

表单的验证

  • is_valid() 验证表单数据是否合法
  • cleaned_data 获取表单通过验证的数据
  • errors 表单验证的错误信息

在form中添加如下代码

class UserInfoForm__Msg(forms.Form):
    '''用户状态'''
    STATUS = ((None, '请选择'), (0, '正常'), (1, '无效'),)
    username = forms.CharField(label="用户名称", min_length=6, widget=forms.widgets.TextInput(
        attrs={'class': 'form-control', 'placeholder': '请输入用户名称'}
    ), error_messages={
        'required': '用户姓名不能为空', 'min_length': '长度不能少于6位', 'invalid': '不能含有特殊字符'
    })
    password = forms.CharField(label="密码", min_length=6, max_length=10, widget=forms.widgets.PasswordInput(
        attrs={'class': 'password'}, render_value=True
    ), error_messages={
        'required': '密码不能为空', 'min_length': '密码不能少于6位', 'max_length': '密码不能多余10位',
    })
    age = forms.IntegerField(label="年龄", initial=1, validators=[age_validate], error_messages={
        'required': '年龄不能为空',
    })
    mobile = forms.IntegerField(label="手机号码", validators=[mobile_validate], error_messages={
        'required': '手机号码不能为空',
    })
    status = forms.ChoiceField(label="用户状态", choices=STATUS, error_messages={
        'required': '用户状态不能为空',
    })
    createdate = forms.DateTimeField(label="创建时间", required=False)
  • required 为空的时候的错误信息
  • invalid 格式验证错误的信息
  • min_length和max_length 长度不在设定的范围的错误信息

添加视图

def userinfo_form_msg(request):
    if request.method == "GET":
        myForm = UserInfoForm__Msg()
        return render(request, 'app1/userinfoform.html', {'form_obj': myForm})
    else:
        f = UserInfoForm__Msg(request.POST)
        if f.is_valid():
            print(f.cleaned_data['username'])
        else:
            errors = f.errors
            print(errors)
            return render(request, 'app1/userinfoform.html', {'form_obj': f, 'errors': errors})
        return render(request, 'app1/userinfoform.html', {'form_obj': f})

模板文件

<form action="" method="POST" novalidate>
  {% csrf_token %}
  <p>
    {{ form_obj.username.label }}:{{ form_obj.username }} {{ errors.username.0 }}
  </p>
  <p>{{ form_obj.password}}{{ errors.password.0 }}</p>
  <p>{{ form_obj.status.label }}:{{ form_obj.status }} {{ errors.status.0 }}</p>
  <p>{{ form_obj.age.label }}:{{ form_obj.age }} {{ errors.age.0 }}</p>
  <p>{{ form_obj.mobile.label }}:{{ form_obj.mobile }} {{ errors.mobile.0 }}</p>
  错误信息汇总: {{ errors }}
  <input type="submit" value="提交" />
</form>

这里还添加了表单的自我格式验证,获取表单的数据

  • f.clean() 获取全部数据
  • f.clean_date[] 获取对应值的数据
  • f.data 获取全部数据

表单模型文件上传例子

模板文件:upload_form.html

<form enctype="multipart/form-data" action="" method="post">
  {% csrf_token %} {{ form_obj.as_p }}
  <br />
  <input type="submit" value="文件上传" />
  <img class="lazy" data-src="media/uploads/{{ user.heading }}"
</form>

模型文件

在models.py中添加模型,这里没有主键默认会生成id的主键

class ImgFile(models.Model):
    name = models.CharField(verbose_name='用户名称', max_length=300, default="")
    heading = models.FileField(verbose_name='文件名', upload_to='media/uploads/')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = ' 用户头像信息'
        db_table = 'user_img'

表单模型 form.py

class ImgFileForm(forms.Form):
    name = forms.CharField()
    heading = forms.FileField()

视图模型

如果上传了文件,将文件保存在对应的目录下,并返回文件的信息。

def ingfileform(request):
    if request.method == "GET":
        f = ImgFileForm()
        return render(request, 'app1/upload_form.html', {'form_obj': f})
    else:
        f = ImgFileForm(request.POST, request.FILES)
        if f.is_valid():
            name = f.cleaned_data['name']
            heading = f.cleaned_data['heading']
            path = 'media/uploads/'
            if not os.path.exists(path):
                os.makedirs(path)
            dest = open(os.path.join(path + heading.name), 'wb+')
            for chunk in heading.chunks():
                dest.write(chunk)
            dest.close()

            userimg = ImgFile()
            userimg.name = name
            userimg.heading = heading
            userimg.save()
            print('上传成功')
            return render(request, 'app1/upload_form.html', {'form_obj': f, 'user': userimg})
        else:
            print(f.errors)

路由

re_path 配置了可以直接在浏览器访问对应的文件,

from django.urls import path, include, re_path
from django.views.static import serve
from mywed import settings
    path('app1/userimg/', views.ingfileform),
    re_path('media/uploads/(?P<path>.*)', serve,
            {"document_root": settings.MEDIA_ROOT}),

settings.py

这里路径在项目文件中设置便于统一,在实际的应用中也应该多在公共文件中设置

MEDIA_URL = "media/uploads/"
MEDIA_ROOT = os.path.join(MEDIA_URL, "")

db中也登陆了对应的信息

模型表单

Django提供了ModelForm可以直接和模型关联,省略了Form表单中定义的操作。

AJAX

模板文件,为了能够正常的访问,必须添加csrfmiddlewaretoken或者在视图函数中注释@csrf_exempt,建议使用第一种方式

用户名:<input type="text" id="username"></input>
密码:<input type="password" id="password"></input>
{% csrf_token %}
<button id="submit">提交</button>
<script class="lazy" data-src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>

$("#submit").click(function(){
    var csrf = $('input[name="csrfmiddlewaretoken"]').val();
    $.ajax({
      url: '/app1/ajax_login_data',
      type: "post",
      data: {
        'username': $("#username").val(),
        'password': $("#password").val(),
        'csrfmiddlewaretoken': csrf
      },
      success: function(data){
        console.log(data)
      },
      error: function(jqXHR, textStatus, err){
        console.log(arguments);
      }
    });
  }); 
</script>

视图文件

from django.views.decorators.csrf import csrf_exempt
def ajax_login(request):
    return render(request, 'app1/ajax.html')


# @csrf_exempt
def ajax_login_data(request):

    if request.method == "GET":
        HttpResponse("内部自己的url")
    username = request.POST.get('username')
    password = request.POST.get('password')
    print(username)
    if username == 'admin' and password == '123456':
        return JsonResponse({
            'code': 1,
            'msg': "登陆成功"
        })
    else:
        print("222")
        return JsonResponse({
            'code': 0,
            'msg': "登陆失败"

这里使用的是网上的jquery地址,也可在settings.py匹配如下,在网站根目录中创建static目录,放入jquery文件。

<script class="lazy" data-src=“/statics/jquery.min.js”></script>

STATIC_URL = '/statics/'

​​​​​​​STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "statics"),
]

以上就是Python Django框架中表单的用法详解的详细内容,更多关于Python Django表单的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python Django框架中表单的用法详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python的Django框架中forms表单类的使用方法详解

Form表单的功能自动生成HTML表单元素检查表单数据的合法性如果验证错误,重新显示表单(数据不会重置)数据类型转换(字符类型的数据转换成相应的Python类型)Form相关的对象包括Widget:用来渲染成HTML元素的工具,如:form
2022-06-04

Python Django框架中表单怎么使用

本篇内容介绍了“Python Django框架中表单怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Django保证表单的正确显示需要
2023-07-02

详解Python的Django框架中manage命令的使用与扩展

【简介】 django-admin.py是Django的一个用于管理任务的命令行工具。本文将描述它的大概用法。 另外,在每一个Django project中都会有一个manage.py。manage.py是对django-admin.py的
2022-06-04

对Python的Django框架中的项目进行单元测试的方法

Python中的单元测试 我们先来回顾一下Python中的单元测试方法。 下面是一个 Python的单元测试简单的例子: 假如我们开发一个除法的功能,有的同学可能觉得很简单,代码是这样的:def division_funtion(x, y)
2022-06-04

详解Python的Twisted框架中reactor事件管理器的用法

铺垫 在大量的实践中,似乎我们总是通过类似的方式来使用异步编程:监听事件事件发生执行对应的回调函数回调完成(可能产生新的事件添加进监听队列)回到1,监听事件因此我们将这样的异步模式称为Reactor模式,例如在iOS开发中的Run Loop
2022-06-04

在Python的Flask中使用WTForms表单框架的基础教程

下载和安装 安装 WTForms 最简单的方式是使用 easy_install 和 pip:easy_install WTForms # or pip install WTForms你可以从 PyPI 手动 下载 WTForms 然后运行
2022-06-04

python的简单web框架flask快速实现详解

这篇文章主要为大家介绍了python的简单web框架flask快速实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-07

在Python的Flask框架中构建Web表单的教程

尽管Flask的request对象提供的支持足以处理web表单,但依然有许多任务会变得单调且重复。表单的HTML代码生成和验证提交的表单数据就是两个很好的例子。 Flask-WTF扩展使得处理web表单能获得更愉快的体验。该扩展是一个封装了
2022-06-04

详解Spring 框架中切入点 pointcut 表达式的常用写法

自从使用 AspectJ 风格切面配置,使得 spring 的切面配置大大简化,但是 AspectJ 是另外一个开源项目,其规则表达式的语法也稍稍有些怪异。下面给出一些常见示例的写法,例如,下面是一个对 Service 包上所有方法的切面配
2023-05-31

Python中的Unittest框架的用法

本篇内容主要讲解“Python中的Unittest框架的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的Unittest框架的用法”吧!  Unittest  1.环境  Un
2023-06-02

详解Python的Flask框架中生成SECRET_KEY密钥的方法

引子 如果遇到了 Must provide secret_key to use csrf错误提醒,原因就是没有设置secret_key ,在代码中加上app.config[‘SECRET_KEY‘]=‘xxx‘SECRET_KEY最好不要写
2022-06-04

Android中XUtils3框架使用方法详解(一)

xUtils简介 xUtils 包含了很多实用的android工具。xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...xUitls 最低兼容android
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录