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二维码生成库qrcode安装和使用示例
Dec 16 Python
详解C++编程中一元运算符的重载
Jan 19 Python
Python面向对象编程基础解析(二)
Oct 26 Python
python模拟事件触发机制详解
Jan 19 Python
Python设计模式之代理模式实例详解
Jan 19 Python
python给微信好友定时推送消息的示例
Feb 20 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
python学生管理系统学习笔记
Mar 19 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
Dec 03 Python
python实现简单的学生管理系统
Feb 22 Python
用Python写一个简易版弹球游戏
Apr 13 Python
Python实现批量自动整理文件
Mar 16 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实现网站插件机制的方法
2009/11/10 PHP
两级联动select刷新后其值保持不变的实现方法
2014/01/27 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
javascript学习笔记(十四) window对象使用介绍
2012/06/20 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
Python列表(list)常用操作方法小结
2015/02/02 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
Python通过字典映射函数实现switch
2020/11/06 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
英语专业学生个人求职信范文
2014/01/06 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
星级党支部申报材料
2014/05/31 职场文书
安全目标责任书
2014/07/22 职场文书
社区党支部承诺书
2015/04/29 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
争做文明公民倡议书
2019/06/24 职场文书
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技