最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
django如何实现模型字段动态choice django实现模型字段动态choice方法
时间:2020-04-01 编辑:袖梨 来源:一聚教程网
本篇文章小编给大家分享一下django实现模型字段动态choice方法,通过文中代码详细介绍了几种django实现模型字段动态choice方式,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
需求是根据当前登录用户来显示某个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变量
不过这么的坏处是用户列表信息直接暴露在前端代码里了,跟直接在js里维护一个测试用户列表一样的效果,遂放弃这种做法
实现方式3:
后端写一个视图接口,返回对应的test_user_list,js里写一个ajax请求,来请求这个视图获取test_user_list
实测没有问题。
补充知识: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定时任务Django-crontab代码使用解析 07-08
- Django实现视频播放代码示例 05-31
- Django框架cookie和session方法及参数设置代码示例 03-22
- django中websocket的具体使用方法 01-21
- Django记录操作日志与LogEntry代码使用解析 01-07
- Django路由层获取正确的url代码示例 07-17