• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞代码 4年前 (2022-01-07) 37次浏览 已收录 0个评论

这篇文章主要介绍了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

实测没有问题。

实现方式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字段

 # model<b style="color:transparent">来源gao@!dai!ma.com搞$$代^@码!网</b>s.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的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持gaodaima搞代码网

以上就是django实现模型字段动态choice的操作的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:django实现模型字段动态choice的操作

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址