Django Admin 嵌套内联

新手上路,请多包涵

我需要一个嵌套的 django 管理内联,我可以将日期字段内联包含在另一个内联中,如下所示。

我有以下模型:

 class Person(models.Model):
     name = models.CharField(max_length=200)
     id_no = models.IntegerField()

class Certificate(models.Model):
     cerfificate_no = models.CharField(max_length=200)
     certificate_date = models.DateField(max_length=100)
     person = models.ForeignKey(Person)
     training = models.CharField(max_length=200)

class Training_Date(models.Model):
      date = models.DateField()
      certificate = models.ForeignKey(Certificate)

并且,下面的管理员:

 class CertificateInline(admin.StackedInline):
    model = Certificate

class PersonAdmin(admin.ModelAdmin):
     inlines = [CertificateInline,]
admin.site.register(Person,PersonAdmin)

但是,我需要将 Training_Date 模型作为内联包含在内,这是内联证书管理的一部分。

任何想法?

原文由 tuna 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 835
2 个回答

AFAIK,您不能在默认的 Django 管理中有第二级内联。

Django admin 只是一个普通的 Django 应用程序,所以没有什么能阻止你实现第二级嵌套表单,但恕我直言,这将是一种复杂的设计来实现。也许这就是为什么没有相关规定的原因。

原文由 Paulo Scardine 发布,翻译遵循 CC BY-SA 3.0 许可协议

https://code.djangoproject.com/ticket/9025 最近有点动静,但我不会屏住呼吸。

解决此问题的一种常见方法是通过同时拥有 ModelAdmin 和同一模型的内联来链接到第一和第二(或第二和第三)级别之间的管理员:

Certificate a ModelAdminTrainingDate 作为内联。给 CertificateInline 一个附加字段“详细信息”,它是指向其 ModelAdmin 更改表单的链接。

模型.py:

 from django.core import urlresolvers

class Certificate(models.Model):

    # ...

    def changeform_link(self):
        if self.id:
            # Replace "myapp" with the name of the app containing
            # your Certificate model:
            changeform_url = urlresolvers.reverse(
                'admin:myapp_certificate_change', args=(self.id,)
            )
            return u'<a href="%s" target="_blank">Details</a>' % changeform_url
        return u''
    changeform_link.allow_tags = True
    changeform_link.short_description = ''   # omit column header

管理员.py:

 # Certificate change form has training dates as inline

class TrainingDateInline(admin.StackedInline):
    model = TrainingDate

class CertificateAdmin(admin.ModelAdmin):
    inlines = [TrainingDateInline,]
admin.site.register(Certificate ,CertificateAdmin)

# Person has Certificates inline but rather
# than nesting inlines (not possible), shows a link to
# its own ModelAdmin's change form, for accessing TrainingDates:

class CertificateLinkInline(admin.TabularInline):
    model = Certificate
    # Whichever fields you want: (I usually use only a couple
    # needed to identify the entry)
    fields = ('cerfificate_no', 'certificate_date', 'changeform_link')
    readonly_fields = ('changeform_link', )

class PersonAdmin(admin.ModelAdmin):
    inlines = [CertificateLinkInline,]
admin.site.register(Person, PersonAdmin)

原文由 Danny W. Adair 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题