django实现模型字段动态choice的操作


Posted in Python onApril 01, 2020

需求是根据当前登录用户来显示某个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)

以上这篇django实现模型字段动态choice的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
python的多重继承的理解
Aug 06 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
Python3实现转换Image图片格式
Jun 21 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
Python必须了解的35个关键词
Jul 16 Python
Python实现天气查询软件
Jun 07 Python
Python气泡提示与标签的实现
Apr 01 #Python
django 多数据库及分库实现方式
Apr 01 #Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 #Python
Django更新models数据库结构步骤
Apr 01 #Python
pycharm工具连接mysql数据库失败问题
Apr 01 #Python
利用Python自动化操作AutoCAD的实现
Apr 01 #Python
python使用信号量动态更新配置文件的操作
Apr 01 #Python
You might like
用PHP实现多服务器共享SESSION数据的方法
2007/03/16 PHP
smarty section简介与用法分析
2008/10/03 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
node.js中watch机制详解
2014/11/17 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
jQuery滚动加载图片实现原理
2015/12/14 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
爷爷追悼会答谢词
2014/01/24 职场文书
运动会方阵解说词
2014/02/12 职场文书
企业员工薪酬方案
2014/06/04 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
万能检讨书2000字
2014/10/17 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电
Python开发五子棋小游戏
2022/05/02 Python