BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #18575同步于 2017/8/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

【问题django】如何让admin里的两个下拉栏选项耦合起来

KillerDeath
2017/8/7镜像同步11 回复
最近想做一个语料标注的后台,包含用户权限,就选择了django自带的admin模块来开发。遇到了一个问题,查了官方文档和google,没怎么看懂。求问论坛大神~~ 每条文本有两个类别标注,类别是包含关系,分为一级和二级类目,想做到标注时,勾选一级类目后,二级的下拉候选项只给当前一级类目下的。是要用Forms,Fileds类还是要用ChoiceField类? 现在图示是: 上代码清楚一些: 【models.py】 ```python from django.db import models # Create your models here. TAGS = { "教育成长": ["校园教育", "家庭教育", "社会教育", "考研出国", "校园生活"], "社团生活": ["社团组织", "学生组织", "公益活动", "志愿服务", "社会实践"], } class YouthForumData(models.Model): question_text = models.TextField() pub_date = models.DateTimeField('date published') FIRST_TAGS = [(k, k) for k in TAGS] + [('unknown', 'unknown')] SECOND_TAGS = [(k, [ [v, v] for v in val ]) for k, val in TAGS.items()] + [('unknown', 'unknown')] first_class = models.CharField( max_length=20, choices=FIRST_TAGS, default='unknown') second_class = models.CharField( max_length=20, choices=SECOND_TAGS, default='unknown') def was_tagged_manually(self): return 'unknown' not in [self.first_class, self.second_class] was_tagged_manually.admin_order_field = 'pub_date' was_tagged_manually.boolean = True was_tagged_manually.short_description = 'already tagged?' def __str__(self): return self.question_text ``` 【admin.py】 ```python class YouthForumDataAdmin(admin.ModelAdmin): # 定义列表页显示元数据字段 list_display = ('question_text', 'first_class', 'second_class', 'was_tagged_manually') # 定义可链接元数据字段 list_display_links = ('question_text', ) # 定义再列表页可编辑字段 list_editable = ('first_class', 'second_class') # 定义列表页右侧过滤字段 list_filter = ['first_class',] # 列表页每页显示数据量 list_per_page = 15 # 定义列表页搜索候选元数据 search_fields = ['question_text',] ```
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Zelda机器人#1 · 2017/8/8
这种情况是model设计不符合3NF吧……
buptxiaomiao机器人#2 · 2017/8/8
1.这两个级别的东西存在两张表里 2.选择第一个下拉框触发onchange事件,发送Ajax. 3.根据第一个下拉框选择的项,查数据库第二个表 4.根据查找数据渲染第二个下拉框
KillerDeath机器人#3 · 2017/8/8
【 在 Zelda 的大作中提到: 】 : 这种情况是model设计不符合3NF吧…… 可能也是有这部分原因,只是想借用django的admin模块进行开发。 不过最后又查了查google,有开源的实现了这个,可以无缝接入admin模块:Django Smart Selects github地址:https://github.com/digi604/django-smart-selects
KillerDeath机器人#4 · 2017/8/8
【 在 buptxiaomiao 的大作中提到: 】 : 1.这两个级别的东西存在两张表里 : 2.选择第一个下拉框触发onchange事件,发送Ajax. : 3.根据第一个下拉框选择的项,查数据库第二个表 : ................... 是的,可以这么做的。 不过,我是前端小白,所以倾向于如何借助后台model对外键的使用来实现。最后发现了神奇的东西:django-smart-selects 直接在后台model里定义数据表之间的外键关系即可,admin模块可以自动加载js和css帮你再页面渲染好
buptxiaomiao机器人#5 · 2017/8/8
厉害了 我也是前端小白... pip可以不可直接安装 【 在 KillerDeath (KillerDeath) 的大作中提到: 】 : 是的,可以这么做的。 : 不过,我是前端小白,所以倾向于如何借助后台model对外键的使用来实现。最后发现了神奇的东西:django-smart-selects : ...................
KillerDeath机器人#6 · 2017/8/8
可以,直接pip install 【 在 buptxiaomiao (吃藕吃藕equal丑丑) 的大作中提到: 】 : 厉害了 我也是前端小白... : pip可以不可直接安装
buptxiaomiao机器人#7 · 2017/8/8
等你明天看看源码 希望不要太臃肿... 【 在 KillerDeath (KillerDeath) 的大作中提到: 】 : 可以,直接pip install
xdx机器人#8 · 2017/8/8
其实这跟django本身没太大关系,用django调用Jquery来制作二级联动下拉框,把js文件和模板啥的放在指定目录,配好框架中的urls.py啥的,让jquery可以被django成功调用就行。晚上网上找个模板,改改,最多涉及数据库调用,用python调就行。
KillerDeath机器人#9 · 2017/8/9
羡慕会前端的大神呐 【 在 xdx (heihei) 的大作中提到: 】 : 其实这跟django本身没太大关系,用django调用Jquery来制作二级联动下拉框,把js文件和模板啥的放在指定目录,配好框架中的urls.py啥的,让jquery可以被django成功调用就行。晚上网上找个模板,改改,最多涉及数据库调用,用python调就行。