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 mysqldb连接数据库
Mar 16 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
python实现大量图片重命名
Mar 23 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
tensorflow之自定义神经网络层实例
Feb 07 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
python实现自定义日志的具体方法
May 28 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
一个显示天气预报的程序
2006/10/09 PHP
第十二节--类的自动加载
2006/11/16 PHP
php 静态化实现代码
2009/03/20 PHP
php 获取可变函数参数的函数
2009/08/26 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
CI框架常用函数封装实例
2016/11/21 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
jquery replace方法去空格
2017/05/08 jQuery
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
python算法学习之计数排序实例
2013/12/18 Python
Python Flask框架扩展操作示例
2019/05/03 Python
Python 占位符的使用方法详解
2019/07/10 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
外贸英语毕业生自荐信
2013/11/14 职场文书
经典安踏广告词
2014/03/21 职场文书
党员剖析材料范文
2014/09/30 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
python中pymysql包操作数据库方法
2022/04/19 Python