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中条件选择和循环语句使用方法介绍
Mar 13 Python
python开发之文件操作用法实例
Nov 13 Python
Python常用内置模块之xml模块(详解)
May 23 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
Python安装Flask环境及简单应用示例
May 03 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
详解python中docx库的安装过程
Nov 08 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
python statsmodel的使用
Dec 21 Python
python math模块的基本使用教程
Jan 16 Python
python神经网络 使用Keras构建RNN训练
May 04 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
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
使用Python实现博客上进行自动翻页
2017/08/23 Python
python反编译学习之字节码详解
2019/05/19 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
pandas取出重复数据的方法
2019/07/04 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
自我评价如何写好?
2014/01/05 职场文书
环保专项行动方案
2014/05/12 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
欢度春节标语
2014/07/01 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
工程部岗位职责
2015/02/10 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书