使用django-crispy-forms美化表单UI
前言
欧克,继续来写这个中台项目衍生出来的系列文章
今天介绍一个可以美化界面的库
Django 开发讲究个快,天下武功,唯快不破
forms 功能自然是要用的,自带表单 UI 生成和验证,实现 demo 时非常方便
之前我在 DjangoStarter 框架里已经封装了一套 forms 行为和样式了,在 src/django_starter/contrib/forms 里
这套已经不错了,也是用 TailwindCSS 来实现样式,挺好看的
不过在开发中台项目的时候,我发现了 django-crispy-forms 这个库,提供了更多美化表单 UI 的灵活性。
DjangoStarter里的实现
先来看看 DjangoStarter 框架的实现
forms
├─ widgets
│ ├─ __init__.py
│ ├─ multiple_file.py
│ └─ flowbite_date_picker.py
├─ templates
│ └─ django_starter
│ └─ forms
│ ├─ widgets
│ └─ form_template.html
├─ __init__.py
├─ widget_classes.py
├─ mixins.py
└─ base.py
template
src/django_starter/contrib/forms/templates/django_starter/forms/form_template.html
{% for field in form %}
<div>
<label class="block mb-2 text-sm font-medium text-gray-900 dark:text-white"
for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
<div class="mt-2 text-sm text-gray-500 dark:text-gray-200">
{{ field.help_text }}
</div>
<div class="mt-2 text-sm text-red-600 dark:text-red-500">
{{ field.errors }}
</div>
</div>
{% endfor %}
widgets
src/django_starter/contrib/forms/widgets/flowbite_date_picker.py
from django import forms
class FlowbiteDatePickerWidget(forms.DateInput):
template_name = 'django_starter/forms/widgets/flowbite_date_picker.html'
def __init__(self, attrs=None, custom_class=''):
final_attrs = {'class': custom_class}
if attrs:
final_attrs.update(attrs)
super(FlowbiteDatePickerWidget, self).__init__(attrs=final_attrs)
src/django_starter/contrib/forms/widgets/multiple_file.py
from django import forms
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
class MultipleFileField(forms.FileField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)
def clean(self, data, initial=None):
single_file_clean = super().clean
if isinstance(data, (list, tuple)):
result = [single_file_clean(d, initial) for d in data]
else:
result = [single_file_clean(data, initial)]
return result
forms 代码
src/django_starter/contrib/forms/mixins.py
from django import forms
from .widget_classes import *
class BaseFormMixin:
"""提供表单样式的通用混入类"""
widget_classes = {
forms.TextInput: TEXT_INPUT_CLASS,
forms.Textarea: TEXT_AREA_CLASS,
forms.EmailInput: TEXT_INPUT_CLASS,
forms.PasswordInput: PASSWORD_INPUT_CLASS,
forms.Select: SELECT_CLASS,
forms.DateInput: DATE_INPUT_CLASS,
forms.NumberInput: NUMBER_INPUT_CLASS,
}
def apply_widget_classes(self):
"""根据widget类型为表单字段应用样式"""
for field_name, field in self.fields.items():
widget_class = self.widget_classes.get(type(field.widget))
if widget_class:
field.widget.attrs.update({'class': widget_class})
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.apply_widget_classes()
widget_classes.py 的代码就不贴了
就是 Tailwind CSS 的样式
crispy-forms 是咋实现的
安装后,简单配置下就能用了
使用起来类似下面这样
{% load crispy_forms_tags %}
<div class="sm:col-span-6">
{{ form.name|as_crispy_field }}
</div>
<div class="sm:col-span-3">
{{ form.dvr_brand|as_crispy_field }}
</div>
<div class="sm:col-span-3">
{{ form.dvr_model|as_crispy_field }}
</div>
<div class="sm:col-span-3">
{{ form.dvr_ip|as_crispy_field }}
</div>
<div class="sm:col-span-3">
{{ form.status|as_crispy_field }}
</div>
安装
安装依赖
pdm install django-crispy-forms
然后添加到
INSTALLED_APPS = (
...
'crispy_forms',
)
Template packs
然后还得安装 Template packs
不然只是个空壳
官方支持的只有 Bootstrap 系列,有点 out 了
好在社区也提供了不少,这里我只关注 Tailwind CSS 的库,名字是 crispy-tailwind
pdm add crispy-tailwind
其他 UI 库还有很多,感兴趣的同学可以在官网看到: https://django-crispy-forms.readthedocs.io/en/latest/install.html#template-packs
这个同样也得添加进去
INSTALLED_APPS = (
...
'crispy_forms',
'crispy_tailwind',
)
配置
在配置文件里修改默认的 Template Packs
src/config/settings/components/crispy_forms.py
CRISPY_ALLOWED_TEMPLATE_PACKS = "tailwind"
CRISPY_TEMPLATE_PACK = "tailwind"
使用
最简单的用法是只修改模板文件
{% load crispy_forms_tags %}
<form method="post" class="my-class">
{{ my_formset|crispy }}
</form>
目前中台项目也只用到了这个
搭配 django-select2 可以实现下拉搜索框
不过样式不好改,我折腾了一段时间也没改好,索性先不理了,反正就是一个快速实现的 DEMO
后续有需求再用 React 重写页面就行了
小结
我发现 Django 相关的技术还算是比较小众的
一般写这种文章就没什么人看
我做 Django 也好几年的时间了,框架源码看了,脚手架也搞了,用得非常顺手
虽然现在 python 的 web 框架有很多,不过所有项目最终都会成为 Django 的样子
就这样吧,python 项目这一块,我还是会继续坚持 Django ,毕竟是真的方便好用
当然也不排斥尝试新的玩意,比如最近有个 Litestar 号称要干掉 FastAPI 的,感觉挺有意思的,有时间可以试试看
使用django-crispy-forms美化表单UI的更多相关文章
- Django组件之Form表单
一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...
- 第三百一十一节,Django框架,Form表单验证
第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...
- 应用Css美化表单
原来的效果 美化之后的效果 实现代码 <style> .container { margin:0auto; width:620px; } fieldset { padding:18px ...
- CSS3美化表单 移动端可用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- Django框架 之 Form表单和Ajax上传文件
Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...
- 学习笔记 第十章 使用CSS美化表单
第10章 使用CSS美化表单 [学习重点] 正确使用各种表单控件 熟悉HTML5新增的表单控件 掌握表单属性的设置 设计易用性表单页面 10.1 表单的基本结构 表单包含多个标签,由很多控件组成 ...
- Django学习笔记之表单验证
表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...
- 3 django系列之Form表单在前端web界面渲染与入库保存
author: 温柔易淡(Leo),欢迎技术交流与拍砖 preface 我们在前端写表单的时候,其实可以使用django自带的forms功能来实现,特别是在处理 修改已经存在数据 的场景特别好用,下面 ...
- 3.django笔记之form表单
作者:刘耀 瞎copy伸手党 我在诅咒你. Django的form的作用: 1.生成html标签 2.用来做用户提交的验证 3.可以和models一起使用(modelform) 一.form基础 工程 ...
- Django中的Form表单
Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...
随机推荐
- JS 对象(Object)和字符串(String)互转方法、JS遍历对象
原文:https://www.cnblogs.com/fps2tao/p/8723164.html 1.对象(Object)和字符串(String)互转 利用原生JSON对象,将对象转为字符串 var ...
- 小模型工具调用能力激活:以Qwen2.5 0.5B为例的Prompt工程实践
在之前的分析中,我们深入探讨了cline prompt的设计理念(Cline技术分析:prompt如何驱动大模型对本地文件实现自主变更),揭示了其在激发语言模型能力方面的潜力.现在,我们将这些理论付诸 ...
- chatGPT:清理 master 分支的文件,并让这个分支只有一个提交
Q 我的开发工作都在 master 分支上做的,master 分支有很多的开发的时候产生的临时文件.我想清空 master 分支的历史记录.并且只保留 README.md 和 main.py A 你可 ...
- 【HUST】网安|计算机网络|计算机网络自顶向下方法(原书第7版)第三章部分习题答案
参考:英文版的原答案. 答案放gitee了,自取. 3-P18. 3.4.4 节我们学习的一般性 SR 协议中,只要报文可用(如果报文在窗口中) ,发送方就会不等待确认而传输报文.假设现在我们要求一个 ...
- Java实现minio上传文件加解密操作
一.背景与需求 在云存储场景中,数据安全是核心需求之一.MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,确保即使存储服务器被攻破,攻击者也无法获取明文数据.本文将详 ...
- 如何医治一条慢SQL?
前言 "苏工,订单列表又崩了!" 接到电话时,我对着监控大屏上999ms的SQL响应时间哭笑不得. 几年来,我发现一个定律:所有SQL问题都是在凌晨三点爆发! 今天抽丝剥茧,教你用 ...
- JAVA 24 环境安装与配置
JAVA 24 环境安装与配置 一.Java Downloads Java 下载(Windows x64) https://www.oracle.com/java/technologies/downl ...
- RPC实战与核心原理之优雅关闭
优雅关闭:如何避免服务停机带来的业务损失? 上线的大致流程 当服务提供方要上线的时候,一般是通过部署系统完成实例重启.在这个过程中,服务提供方的团队并不会事先告诉调用方他们需要操作哪些机器,从而让调用 ...
- CAP 关键细节点与ACID、BASE的比较
极客时间:<从 0 开始学架构>:想成为架构师,你必须掌握的CAP细节 1.CAP 关键细节点 埃里克·布鲁尔(Eric Brewer)在<CAP 理论十二年回顾:"规则& ...
- python实现小时划分
1.要实现图表如下图 2.后台的数据结构 说明:将每个小时按10分钟为一个时间间隔,分成6段,00.10.20.30.40.50然后将每个时间段组成如下数据:{'time': '22:30', 's ...