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的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
python读写LMDB文件的方法
Jul 02 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
简单了解django索引的相关知识
Jul 17 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
Tensorflow中的降维函数tf.reduce_*使用总结
Apr 20 Python
解决reload(sys)后print失效的问题
Apr 25 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 Python
python给list排序的简单方法
Dec 10 Python
python爬取新闻门户网站的示例
Apr 25 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使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
js中的json对象详细介绍
2014/10/29 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
vue的$http的get请求要加上params操作
2020/11/12 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
python如何快速生成时间戳
2020/07/21 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
大专生自我鉴定范文
2013/10/01 职场文书
司机岗位职责
2013/11/15 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
网络妈妈观后感
2015/06/08 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript