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 相关文章推荐
python实用代码片段收集贴
Jun 03 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
Python传递参数的多种方式(小结)
Sep 18 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 Python
python编写实现抽奖器
Sep 10 Python
教你使用pyinstaller打包Python教程
May 27 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中常用编辑器推荐
2007/01/02 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
CentOS6.5设置Django开发环境
2016/10/13 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
Python修改DBF文件指定列
2020/12/19 Python
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
sort命令的作用和用法
2012/11/04 面试题
经典促销广告词大全
2014/03/19 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
优秀家长自荐材料
2014/08/26 职场文书
高老头读书笔记
2015/06/30 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
导游词之茶卡盐湖
2019/11/26 职场文书
导游词之山东八大关
2019/12/18 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers