前言

欧克,继续来写这个中台项目衍生出来的系列文章

今天介绍一个可以美化界面的库

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的更多相关文章

  1. Django组件之Form表单

    一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...

  2. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  3. 应用Css美化表单

    原来的效果  美化之后的效果  实现代码 <style> .container { margin:0auto; width:620px; } fieldset { padding:18px ...

  4. CSS3美化表单 移动端可用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  5. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  6. 学习笔记 第十章 使用CSS美化表单

    第10章   使用CSS美化表单 [学习重点] 正确使用各种表单控件 熟悉HTML5新增的表单控件 掌握表单属性的设置 设计易用性表单页面 10.1  表单的基本结构 表单包含多个标签,由很多控件组成 ...

  7. Django学习笔记之表单验证

    表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...

  8. 3 django系列之Form表单在前端web界面渲染与入库保存

    author: 温柔易淡(Leo),欢迎技术交流与拍砖 preface 我们在前端写表单的时候,其实可以使用django自带的forms功能来实现,特别是在处理 修改已经存在数据 的场景特别好用,下面 ...

  9. 3.django笔记之form表单

    作者:刘耀 瞎copy伸手党 我在诅咒你. Django的form的作用: 1.生成html标签 2.用来做用户提交的验证 3.可以和models一起使用(modelform) 一.form基础 工程 ...

  10. Django中的Form表单

    Django中已经定义好了form类,可以很容易的使用Django生成一个表单. 一.利用Django生成一个表单: 1.在应用下创建一个forms文件,用于存放form表单.然后在forms中实例华 ...

随机推荐

  1. toRefs 与 toRef 的详解

    一.引言在 Vue 3 的响应式系统里,toRefs 和 toRef 是两个实用的工具函数,它们在处理响应式数据时发挥着重要作用.合理运用这两个函数,可以让我们在操作响应式对象和数组时更加灵活,避免一 ...

  2. ​.NET AI Preview 2 发布:支持 Aspire 与 Qdrant 向量库集成,加速云原生 AI 开发​

    引言 随着人工智能(AI)技术的迅猛发展,开发者对简单.高效的AI开发工具需求日益增加.微软 .NET 团队最近发布了 .NET AI 模板的 Preview 2 版本,这一更新为开发者带来了诸多令人 ...

  3. SpringMVC返回值

    字符串 /** * 测试返回字符串 * @param model model * @return 返回的字符串,通过视图解析器调整到jsp页面 */ @RequestMapping("/te ...

  4. 使用Ollama本地化部署DeepSeek

    1.Ollama 简介 Ollama 是一个开源的本地化大模型部署工具,旨在简化大型语言模型(LLM)的安装.运行和管理.它支持多种模型架构,并提供与 OpenAI 兼容的 API 接口,适合开发者和 ...

  5. RabbitMQ高级使用

    概述 在支付场景中,支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付.但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数 ...

  6. Unity编辑器重新编译代码

    最近碰到Unity编辑器偶尔抽风,明明代码都正常的,编译却有个空报错,导致策划/美术有时候需要重启Unity,有时候需要关掉unity+删除Library/AssemblyScript目录再开unit ...

  7. 实际工作中 Git Commit 代码提交规范是什么样的?

    前言 Git 是我们日常工作中使用最为广泛的分布式版本代码控制系统,因此在我们的实际工作中,git commit 代码提交规范能够让每一次代码提交都变得有据可循,方便后续的代码审查.问题追踪和版本管理 ...

  8. 把iview的table做成更适合展现大量数据的样式(字体变小、去除多余的padding等)

    <style> .ivu-table { font-size: 12px !important; } .ivu-table-header thead tr th { padding: 0p ...

  9. Django批量创建Model实例

    1.前言: 将测试数据全部敲入数据库非常繁琐,而且如果与合作伙伴一起开发,部署,那么他们肯定也不想把时间花在一个一个录入数据的繁琐过程中,这时候,创建一个批量录入数据的脚本(population sc ...

  10. Kafka怎么配置SASL用户名密码认证

    服务端配置(server.properties): # 开启SASL认证 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN # 配置JAAS文 ...