需求是根据当前登录用户来显示某个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的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 完美倒立.2024-夜色碳酸【草台回声】【FLAC分轨】
- 杨青《半山听雨贰HQ》头版限量编号[低速原抓WAV+CUE]
- 白玛多吉《云上西藏1+2》DTS-WAV
- 模拟之声慢刻CD《柏林之声3》[正版CD原抓WAV+CUE]
- 威神V(WayV)《The Highest》[FLAC/分轨][259.1MB]
- 余超颖《迷焕纪》[320K/MP3][201.15MB]
- 余超颖《迷焕纪》[FLAC/分轨][784.22MB]
- 温岚.2005-爱回温新歌加精选2CD【阿尔发】【WAV+CUE】
- 尤雅.1990-台语怀念金曲特选辑【太阳神】【WAV+CUE】
- 群星.2024-七夜雪电视剧影视原声带【听见时代】【FLAC分轨】
- 群星《胎教音乐 古典钢琴曲与水晶摇篮曲》[320K/MP3][134.14MB]
- 群星《胎教音乐 古典钢琴曲与水晶摇篮曲》[FLAC/分轨][654.13MB]
- 许惠钧《睡眠钢琴与校园民歌金曲 空灵新世纪催眠曲》[320K/MP3][201.15MB]
- wbg战队国籍分别都是哪里的 wbg战队2024阵容国籍介绍
- wbg战队教练是韩国人吗 s14wbg战队教练国籍介绍