django实现模型字段动态choice的操作
作者:wangjinyu124419 发布时间:2023-08-13 07:30:31
需求是根据当前登录用户来显示某个choice字段不同的选择项。
先放现在的实现版本。
1、重写PushRuleForm的__init__方法,
让每次实例化PushRuleForm时,test_mode字段的choices根据用户重新赋值
class PushRuleForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
if self.request.user.username in Const.TEST_USER_LIST:
# 如果进入都是add添加新项的页面
if not kwargs.get('instance'):
# self.fields['test_mode'].initial = 1
self.fields['test_mode'].choices = [(1,'Test')]
# else:
# self.fields['test_mode'].choices = [choice for choice in [(0,'OnLine'),(1,'Test')] if self.instance.test_mode in choice]
2、重写PushRuleAdmin的changeform_view方法,进入add和change页面都会调用changeform_view方法,都能让form获取request属性,所以重写这个方法比较好,PushRuleForm获取request属性后,form表单处理是就能通request.user.username取用户名
class PushRuleAdmin:
form = PushRuleForm
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
self.form.request = request
return super(PushRuleAdmin, self).changeform_view(request, object_id, extra_context=extra_context)
mode.py对应的代码如下:
class PushRule(models.Model):
test_mode = models.IntegerField(verbose_name='TestMode', default=0, choices=[(0,'OnLine'),(1,'Test')])
实现方式2:
,重写PushRuleAdmin的render_change_form方法,传入test_user_list上下文,通过js来判断当前用户是否是测试用户。
class PushRuleAdmin:
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
context['test_user_list']=Const.TEST_USER_LIST
return super(PushRuleAdmin, self).render_change_form(request, context, add=False, change=False, form_url='', obj=None)
js代码:
if (test_user_list.includes(username))
{
$("#id_test_mode > option[value='0']").remove();
}
html模板代码:
为了让js获取django模板变量,先定义一个username和test_user_list变量
<script> var username="{{ user.username }}", test_user_list="{{ test_user_list }}"</script>
不过这么的坏处是用户列表信息直接暴露在前端代码里了,跟直接在js里维护一个测试用户列表一样的效果,遂放弃这种做法
实现方式3:
后端写一个视图接口,返回对应的test_user_list,js里写一个ajax请求,来请求这个视图获取test_user_list
实测没有问题。
实现方式4:
类似方法2,只不过不通过js来处理,直接通过django模板来处理,主要是重写django/contrib/admin/templates/admin/includes/fieldset.html这个模板文件,对django模板语法不太熟,遂放弃。
未实现的思路,想在PushRuleAdmin中直接修改model的test_mode字段的chioce选项,不过没实现,
想修改model的fields,不过发现他是一个ImmutableList类型,修改会报错。
不过stackoverflow上的给出的这个方法不错,可以参考,就是缺一个获取用户名的地方,哪天再看一下
补充知识:django 中优雅的使用 choice 字段
问题
django中如何比较优雅的对元组进行标记分类。可使用choice字段
choice字段
# models.py
class BookTagNum(object):
OTHER = 1
SCIENCE = 2
SOCIAL_SCIENCES = 3
ECONOMIC = 4
COMPUTER = 5
class BOOK(models.Model):
TAG_NUM_CHOICE = (
(BookTagNum.OTHER, '其它'),
(BookTagNum.SCIENCE, '科学类'),
(BookTagNum.SOCIAL_SCIENCES, '社科类'),
(BookTagNum.ECONOMIC, '经济类'),
(BookTagNum.COMPUTER, '计算机类'),
)
tag = models.IntegerField(choices=TAG_NUM_CHOICE)
在代码中尽量不要出现固定的硬编码,比如某个判断条件,判断书的分类为:
# view.py
def get(self, request):
book = Book.obejects.filter(tag = BookTagNum.COMPUTER)
来源:https://blog.csdn.net/u011519550/article/details/104594236


猜你喜欢
- 影响的范围: IE的所有版本在表单的radio/checkbox控件中,一旦他们的DOM结构被更改过就会出现这个bug。bug描述当象下例中
- 1. 什么是同源策略 理解跨域首先必须要了解同源策略。同源策略是浏览器上为安全性考虑实施的非
- 我的原数据库是3.23版本的.前几天因为一个论坛转移.必须用5.1的.于是就是升级了数据库.论坛是正常的.可以是原来的一个老库因为是3.23
- 对于英文文本分句比较简单,只要根据终结符"."划分就好,中文文本分句看似很简单,但是实现时会遇到很多麻烦,尤其是处理社交
- 一个线上问题的引发的思考 今天上班的时候,开发的同事拿过来一个.zip的压缩包文件,说是要把里面的数据
- 微信指数爬取 Appium + mitmproxy + 网易mumu安卓模拟器实现微信指数小程序爬取通过appium实现将指令传输
- 一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果
- 井字棋简介井字棋又称三子棋,英文名为Tic Tac Toe。具体玩法为在一个3x3的棋盘上,一个玩家用X做棋子,另一个玩家用O做棋子,谁先在
- ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才
- <div id="d1"></div> <script > fu
- 最近做项目中有一个模块是用于实时监控的,左边有个菜单栏用于显示所有的设备,那当然是从数据库中动态获取的了,右边是个iframe用于显示监控画
- 通配符:通配符描述示例%包含零个或更多字符的任意字符串。WHERE title LIKE '%computer%' 将查找处
- 如果可以减少过多的外部隔离的API和简化部署的细节 这会是非常好的。在以前的文章中,我解释了"一些使用反向代理的好处&
- 一.主键:1.1)主键字段定义:在数据库表中,如果有一组字段能够唯一确定一条记录,则可以把它们设计成表的主键字段。例子:如果要创
- 让你成功安装vscode中go的相关插件注意:该演示环境是windows环境,linux和mac环境操作思路一样vscode中有很多go的相
- 用js实现漂亮的雪花飘过效果:步骤:页面基本样式,雪花旋转动画效果body{ width: 100vw; height: 100vh; ba
- 在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话
- 一、设置画布turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置turtle.screensize(canvwidth=600
- 本文主要介绍了Pyecharts地理数据可视化,分享给大家,具体如下:一、Pyecharts简介和安装1. 简介Echarts 是一个由百度
- 由于客户提供的是excel文件,在使用时期望使用csv文件格式,且对某些字段内容需要做一些处理,如从某个字段中固定的几位抽取出来,独立作为一