django-simpleui是一套优秀的django admin增强组件, 适合于熟悉 vue2/element-ui技术栈的朋友,可以很方便的使用element-ui中的前端组件美化页面。其pypi站的链接 https://pypi.org/project/simpleui/。有社区版和专业版,社区版使用了element-ui的默认样式,其专业版功能强大,而且样式更加美观。
自定义组件仍然遵循django的规范,本文省略了创建项目和应用等一系列过程,只写核心过程
第一步,在admin.py中设置 form属性
class XXXAdmin(admin.ModelAdmin):
...
form = XXXForm
第二步,在form.py中定义 XXXForm,在widgets属性中,设置字段(field)和控件(widget)的对应关系
class XXXForm(forms.ModelForm):
class Meta:
model = UibReport
fields = forms.ALL_FIELDS
widgets = {
'yourfield': ElSwitchWidget(),
}
第三步,定义ElSwitchWidget
class ElSwitchWidget(widgets.Widget):
""" 默认显示的标签,如需改变,则传入不同的labels """
labels = {1: '启用', 0: '停用'}
def __init__(self, attrs=None):
if attrs is not None:
attrs = attrs.copy()
self.labels = attrs.pop('labels', self.labels)
super().__init__(attrs)
# 将js脚本和页面模板分开处理,以保持文件结构清晰,如果代码比较简单,也可以不拆分 js文件,直接在 模板的 <script>段直接实现
@property
def media(self):
js = ["js/widget/el-switch.js"]
return forms.Media(js=["%s" % path for path in js])
# 实现render方法,引用了widget目录下的el-switch.html模板文件
def render(self, name, value, attrs=None, renderer=None):
out = render_to_string(template_name='widget/el-switch.html',
context={'name': name, 'value': value, 'attrs': attrs, 'labels': self.labels})
return out
第四步,在部件目录widget中创建 el-switch.html,模板中使用了 el-switch组件
<div id="id_{{name}}">
<input type="hidden" name="{{ name }}" :value="value" />
<el-switch
v-model="value"
active-value="1"
inactive-value="0"
active-color="#13ce66"
inactive-color="#bbb">
</el-switch>
<span v-if="value == '1'" v-html="labels[1]"></span>
<span v-else v-html="labels[0]"></span>
</div>
<script type="text/javascript">
initElSwitchWidget('{{ name }}', '{{value}}', {{ labels|safe }})
</script>
第五步,在静态资源目录js/widget中创建 el-switch.js文件,定义了initElSwitchWidget方法, 该文件在部件类的media属性中引用
function initElSwitchWidget(name, value, labels) {
new Vue({
el: '#id_'+name,
data: {
value: value,
labels: labels,
}
})
}
以上拆分出许多文件 admin.py form.py widget.py el-switch.html el-switch.js, 是我在项目中使用的规范, 每一类文件的路径和命名都遵守相同的规则,更好的管理大量的组件。 当然,如果习惯将部件都写在widget.py中,也是可以的,但这样一来, 如果页面上有很多个checkbox需要替换时, 页面代码中就会有很多段 <script …… </script>, 不那么美观。
以上是 2022年11月,我在回答群友问题时整理的。
2025/9/13 于北京/上东廓