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实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
python中lambda()的用法
Nov 16 Python
Python切片索引用法示例
May 15 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
python感知机实现代码
Jan 18 Python
java判断三位数的实例讲解
Jun 10 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
python输入中文的实例方法
Sep 14 Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 Python
Python预测分词的实现
Jun 18 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中的cookie
2006/11/26 PHP
PHP 事务处理数据实现代码
2010/05/13 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
PHP错误机制知识汇总
2016/03/24 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python定时任务sched模块用法示例
2018/07/16 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
Python序列化pickle模块使用详解
2020/03/05 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
pandas按条件筛选数据的实现
2021/02/20 Python
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
文员自我评价怎么写
2013/09/19 职场文书
进修护士自我鉴定
2013/10/14 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
群众路线个人整改方案
2014/10/25 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
python 三边测量定位的实现代码
2021/04/22 Python
Python基础知识学习之类的继承
2021/05/31 Python