it-swarm.dev

Django Yönetici satır içi iç içe geçmiş

Tarih alanı satır içi satırlarını aşağıdaki gibi başka bir satır içi satırına dahil edebildiğim iç içe geçmiş bir Django admin satır içi,

Aşağıdaki modellere sahibim:

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)

ve aşağıdaki yönetici:

class CertificateInline(admin.StackedInline):
    model = Certificate

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

fakat Training_Date modelini Sertifika yöneticisi satır içi parçası olan satır içi olarak eklemem gerekiyor.

Herhangi bir fikir ? 

38
tunaktunak

AFAIK, varsayılan Django admin'de ikinci bir satır içi satıra sahip olamazsınız.

Django yöneticisi yalnızca normal bir Django uygulamasıdır, bu nedenle hiçbir şey ikinci düzey iç içe formlar uygulamanızı engelleyemez, ancak IMHO uygulaması bir tür kıvrımlı tasarım olacaktır. Belki de bu yüzden bunun için bir hüküm yoktur.

10
Paulo Scardine

https://code.djangoproject.com/ticket/9025 / son zamanlarda bazı hareketler oldu, fakat nefesimi tutmazdım.

Bunun ortak bir yolu, aynı Model için bir ModelAdmin ve bir Inline alarak birinci ve ikinci (veya ikinci ve üçüncü) seviye arasında bir yöneticiye bağlanmaktır:

Sertifikayı TrainingDate ile satır içi olarak bir ModelAdmin verin. CertificateInline'a, ModelAdmin değişiklik formuna bir bağlantı olan ek bir "Ayrıntılar" alanı verin.

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)
34
Danny W. Adair

Daha evrensel çözüm 

from Django.utils.safestring import mark_safe
from Django.core.urlresolvers 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)
15
bigzbig
pip install Django-nested-inline

Bu paket ihtiyacınız olanı yapmalı.

10
s-block

İç içe satırlar şu adresten sağlanır: https://github.com/BertrandBordage/Django-super-inlines/

pip install Django-super-inlines
4
Rick Westera

@Bigzbig tarafından sağlanan çözümü kullandım (teşekkür ederim).

Ayrıca değişiklikler kaydedildikten sonra ilk liste sayfasına geri dönmek istedim.

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))
2