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中的闭包用法实例详解
May 05 Python
Python实现把数字转换成中文
Jun 29 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
Jul 22 Python
使用Python操作excel文件的实例代码
Oct 15 Python
python模拟事件触发机制详解
Jan 19 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 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 微信支付类 demo
2015/11/30 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
python 输出一个两行字符的变量
2009/02/05 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
基于python监控程序是否关闭
2020/01/14 Python
python利用pytesseract 实现本地识别图片文字
2020/12/14 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
标准毕业生自荐信范文
2013/11/04 职场文书
人力资源经理的岗位职责
2014/03/02 职场文书
五年级学生评语
2014/04/22 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
优秀团员个人总结
2015/02/26 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
详解CSS3浏览器兼容
2022/12/24 HTML / CSS