django实现模型字段动态choice的操作
需求是根据当前登录用户来显示某个choice字段不同的选择项。
先放现在的实现版本。
1、重写PushRuleForm的__init__方法,
让每次实例化PushRuleForm时,test_mode字段的choices根据用户重新赋值
classPushRuleForm(forms.ModelForm): def__init__(self,*args,**kwargs): ifself.request.user.usernameinConst.TEST_USER_LIST: #如果进入都是add添加新项的页面 ifnotkwargs.get('instance'): #self.fields['test_mode'].initial=1 self.fields['test_mode'].choices=[(1,'Test')] #else: #self.fields['test_mode'].choices=[choiceforchoicein[(0,'OnLine'),(1,'Test')]ifself.instance.test_modeinchoice]
2、重写PushRuleAdmin的changeform_view方法,进入add和change页面都会调用changeform_view方法,都能让form获取request属性,所以重写这个方法比较好,PushRuleForm获取request属性后,form表单处理是就能通request.user.username取用户名
classPushRuleAdmin: form=PushRuleForm defchangeform_view(self,request,object_id=None,form_url='',extra_context=None): self.form.request=request returnsuper(PushRuleAdmin,self).changeform_view(request,object_id,extra_context=extra_context)
mode.py对应的代码如下:
classPushRule(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来判断当前用户是否是测试用户。
classPushRuleAdmin: defrender_change_form(self,request,context,add=False,change=False,form_url='',obj=None): context['test_user_list']=Const.TEST_USER_LIST returnsuper(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变量
不过这么的坏处是用户列表信息直接暴露在前端代码里了,跟直接在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 classBookTagNum(object): OTHER=1 SCIENCE=2 SOCIAL_SCIENCES=3 ECONOMIC=4 COMPUTER=5 classBOOK(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 defget(self,request): book=Book.obejects.filter(tag=BookTagNum.COMPUTER)
以上这篇django实现模型字段动态choice的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。