用例如下:
我有一个父类:父类有一些基本字段(名称,描述) 我有几个子类Child1,Child2,Child3(带一些额外的字段)
我想显示一个包含以下内容的表单: - 父模型的字段 - 带有可能值的下拉列表:Child1,Child2,Child3 - 然后根据选定的值显示Child1模型字段或child2模型字段等...
最好也是能够在django管理站点中创建它。
所以我可以创建一个CRUD,点击Add按钮显示这个" unique"形成。 然后在列表视图中,我可以看到Child1或Child2,Child3等类型的元素......
示例:
class Trigger(models.Model):
name = models.CharField(_('name'), max_length=64, default='*')
....
class CRONTrigger(Trigger):
minute = models.CharField(_('minute'), max_length=64, default='*')
hour = models.CharField(_('hour'), max_length=64, default='*')
...
class EventTrigger(Trigger):
event_name = models.CharField(_('minute'), max_length=64, default='*')
....
我想要的是什么 127.0.0.1:8090/admin/product/trigger/add/ 返回
name
select CRON or Event
if cron: minute,hours,...
if event: event_name,...
换句话说 我想要 127.0.0.1:8090/admin/product/trigger/add /
返回表格 127.0.0.1:8090/admin/product/crontrigger/add/ 127.0.0.1:8090/admin/product/eventtrigger/add /
或同一页。
修改
最后我找到了解决方案的开头: /管理/生产/触发/添加/
class TriggerAdmin(SynapsAdmin):
inlines = [CronTriggerInline,ThresholdAdminInline]
class ThresholdAdminInline(admin.StackedInline):
model = ThresholdTrigger
extra = 1
class CronTriggerInline(admin.StackedInline):
model = CRONTrigger
extra = 1
现在在管理覆盖中使用一些javascript来隐藏/显示子表单。只需要避免创建cron和阈值对象
答案 0 :(得分:1)
您要做的是:
在表单中创建一个modelchoicefield并将查询集设置为Child.objects.none()
然后在表单的底部添加一些效果:
def __init__(self, your_queryset):
super(ParentForm, self).__init__()
self.fields['child'].queryset = your_queryset
然后,您可以通过引用模板标记的ID来获取所需的任何内容。
答案 1 :(得分:0)
Django Admin默认情况下不支持这样的高级功能,使表单字段根据其他字段值动态移位,但为了做到这一点,您需要扩展Admin模板并使用Jquery:
class MyModelAdmin(admin.ModelAdmin):
list_display = ('field1', 'field2')
class Media:
js = (
'//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js',
'js/myscript.js',
'app/js/myscript.js', )
admin.site.register(MyModel, MyModelAdmin)
my_project
|-- my_project/
|-- myapp1/
|-- myapp2/
|-- templates/
|-- admin/
|-- myapp1/
|-- *.html
|-- myapp2/
|-- *.html
应用程序下的html文件列表应与默认的admin html文件名相同。检查Extending Django’s Admin Interface以了解文件名和扩展文件的基础。