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 ZipFile模块详解
Nov 01 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
简单的编程0基础下Python入门指引
Apr 01 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
python多进程实现进程间通信实例
Nov 24 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
May 24 Python
python使用sessions模拟登录淘宝的方式
Aug 16 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
Python编写单元测试代码实例
Sep 10 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 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连接MongoDB示例代码
2012/09/06 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
JS 图片缩放效果代码
2010/06/09 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
chrome调试javascript详解
2015/10/21 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
BootStrap中
2016/12/10 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
法院实习人员自我鉴定
2013/09/26 职场文书
自荐信怎么写呢?
2013/12/09 职场文书
初中科学教学反思
2014/01/21 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
安全生产汇报材料
2014/02/17 职场文书
群众路线个人整改方案
2014/10/25 职场文书
员工辞退通知书
2015/04/17 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
高中军训感想
2015/08/07 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
Python 全局空间和局部空间
2022/04/06 Python
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫