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编写简单网络爬虫抓取视频下载资源
Nov 04 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
浅谈Python中eval的强大与危害
Mar 13 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
使用Python进行防病毒免杀解析
Dec 13 Python
python实现快递价格查询系统
Mar 03 Python
python实现银行账户系统
Feb 22 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
Vue实现圆环进度条的示例
2021/02/06 Vue.js
Python实现程序的单一实例用法分析
2015/06/03 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
python读取并写入mat文件的方法
2019/07/12 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
Python 实现数组相减示例
2019/12/27 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
一套带答案的C++笔试题
2014/01/10 面试题
迎接领导欢迎词
2014/01/11 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
实习单位意见
2015/06/04 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python