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生成指定尺寸缩略图的示例
May 07 Python
Python实现端口复用实例代码
Jul 03 Python
web.py在模板中输出美元符号的方法
Aug 26 Python
python中类的一些方法分析
Sep 25 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
详解python tkinter模块安装过程
Jan 06 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
python isinstance函数用法详解
Feb 13 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
python3字符串输出常见面试题总结
Dec 01 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中改变图片的尺寸大小的代码
2011/07/17 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
php并发加锁示例
2016/10/17 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
Javascript开发包大全整理
2006/12/22 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
javascript 面向对象编程基础 多态
2009/08/21 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python 常用的基础函数
2018/07/10 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
学生会主席就职演讲稿
2014/01/14 职场文书
索赔员岗位职责
2015/02/15 职场文书
撤诉状格式范本
2015/05/19 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
Java内存模型之happens-before概念详解
2021/06/13 Java/Android