在django中以独特形式呈现父字段和子字段的最佳方法?

时间:2015-12-15 17:24:45

标签: django forms orm

用例如下:

我有一个父类:父类有一些基本字段(名称,描述) 我有几个子类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和阈值对象

2 个答案:

答案 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:

  1. Django使用旧版本的jquery,但您可以通过将其添加到 admin.py 中的元类媒体来更新或添加其他js脚本:
  2.     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)
    
    1. 下一步是扩展Admin模板,这是困难的部分: 为了修改特定应用程序的模板,您必须遵守以下结构:
    2. my_project
           |-- my_project/
           |-- myapp1/
           |-- myapp2/
           |-- templates/
                |-- admin/
                    |-- myapp1/
                        |-- *.html
                    |-- myapp2/
                        |-- *.html
      

      应用程序下的html文件列表应与默认的admin html文件名相同。检查Extending Django’s Admin Interface以了解文件名和扩展文件的基础。