django实现模型字段动态choice的操作

作者:wangjinyu124419 时间:2023-08-13 07:30:31 

需求是根据当前登录用户来显示某个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)

来源:https://blog.csdn.net/u011519550/article/details/104594236

标签:django,字段,choice
0
投稿

猜你喜欢

  • 浅谈python处理json和redis hash的坑

    2023-08-01 10:51:14
  • 基于np.arange与np.linspace细微区别(数据溢出问题)

    2021-08-29 23:46:25
  • python memory_profiler库生成器和迭代器内存占用的时间分析

    2023-01-06 21:25:02
  • ASP防止图片木马上传的代码

    2011-02-05 11:08:00
  • 解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了

    2023-06-13 19:13:36
  • Python中层次聚类的详细讲解

    2022-07-02 06:07:13
  • 详解Python中的时间格式的读取与转换(time模块)

    2021-01-09 17:02:38
  • python sklearn与pandas实现缺失值数据预处理流程详解

    2023-05-31 14:47:56
  • Python自动化办公之Word文档的创建与生成

    2022-06-16 17:49:43
  • Python实战之自动发送邮件的实现

    2023-10-18 15:09:43
  • JavaScript设计模式之适配器模式介绍

    2023-08-12 06:36:09
  • python图形用户接口实例详解

    2023-10-17 21:05:20
  • python中常见进制之间的转换方式

    2021-08-15 13:27:48
  • .net 上传文件前所未有的简单

    2023-07-17 23:20:04
  • mysql提示[Warning] Invalid (old?) table or database name问题的解决方法

    2024-01-14 18:18:54
  • SQL Server作业报错特殊案例分析

    2024-01-15 17:33:02
  • python内置模块collections知识点总结

    2023-10-27 19:37:08
  • js模拟实现Array的sort方法

    2024-04-10 11:03:22
  • PyQt5 实现字体大小自适应分辨率的方法

    2022-08-25 03:07:44
  • 可输入的select代码

    2009-12-26 18:25:00
  • asp之家 网络编程 m.aspxhome.com