60

ネストされたdjangoadminインラインが必要です。これは、以下のような他のインラインに日付フィールドのインラインを含めることができます。

私は以下のモデルを持っています:

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)

ただし、Certificateadmininlineの一部であるTraining_Dateモデルをインラインとして含める必要があります。

何か案が ?

4

7 に答える 7

41

最近https://code.djangoproject.com/ticket/9025で動きがありましたが、息を止めませんでした。

ModelAdminこれを回避する一般的な方法の1つは、同じモデルに対してaとInlineの両方を使用して、第1レベルと第2レベル(または第2レベルと第3レベル)の間で管理者にリンクすることです。

インラインとしてwithをCertificate与えModelAdminます。変更フォームTrainingDateCertificateInlineのリンクである追加のフィールド「詳細」を入力します。ModelAdmin

models.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

admin.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)
于 2013-01-14T23:29:19.627 に答える
29

より普遍的なソリューション

from django.utils.safestring import mark_safe
from django.urls import reverse

class EditLinkToInlineObject(object):
    def edit_link(self, instance):
        url = reverse('admin:%s_%s_change' % (
            instance._meta.app_label,  instance._meta.model_name),  args=[instance.pk] )
        if instance.pk:
            return mark_safe(u'<a href="{u}">edit</a>'.format(u=url))
        else:
            return ''

class MyModelInline(EditLinkToInlineObject, admin.TabularInline):
    model = MyModel
    readonly_fields = ('edit_link', )

class MySecondModelAdmin(admin.ModelAdmin):
    inlines = (MyModelInline, )

admin.site.register(MyModel)
admin.site.register(MySecondModel, MySecondModelAdmin)
于 2014-03-01T11:47:45.547 に答える
19
pip install django-nested-inline

このパッケージはあなたが必要とすることをするはずです。

于 2014-10-26T16:46:19.580 に答える
17

AFAIK、デフォルトのDjango管理者に第2レベルのインラインを設定することはできません。

Django管理者は単なる通常のDjangoアプリケーションであるため、ネストされたフォームの第2レベルを実装することを妨げるものは何もありませんが、私見では、実装するのは一種の複雑な設計になります。おそらくそれがそのための規定がない理由です。

于 2013-01-13T22:18:35.300 に答える
5

ネストされたインラインは、 https ://github.com/BertrandBordage/django-super-inlines/で提供されます。

pip install django-super-inlines
于 2015-05-15T00:44:50.667 に答える
4

より最新の解決策(2021年2月)は、show_change_link構成変数を使用することです:https ://docs.djangoproject.com/en/3.1/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.show_change_link

これは、上記のソリューションで提案されたEditLinkToInlineObjectとまったく同じですが、コードが少なく、おそらくDjango開発者によって十分にテストされています。

show_change_link=Trueインラインのそれぞれで定義する必要があります

更新(2022年1月25日):ドキュメント(Django 4.0)の更新されたリンクは次のとおりです:https ://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.show_change_link

于 2021-02-07T23:16:26.747 に答える
2

@bigzbigが提供するソリューションを使用しました(ありがとうございます)。

また、変更が保存されたら最初のリストページに戻りたいので、次のように追加しました。

class MyModelInline(EditLinkToInlineObject, admin.TabularInline):
    model = MyModel
    readonly_fields = ('edit_link', )

    def response_post_save_change(self, request, obj):
        my_second_model_id = MyModel.objects.get(pk=obj.pk).my_second_model_id
        return redirect("/admin/mysite/mysecondmodel/%s/change/" % (my_second_model_id))
于 2018-01-27T14:47:49.520 に答える