Des numéros imbriqués dans L'administration de Django?

D'accord, j'ai un design assez simple.

class Update(models.Model):
    pub_date = models.DateField()
    title = models.CharField(max_length=512)

class Post(models.Model):
    update = models.ForeignKey(Update)
    body = models.TextField()
    order = models.PositiveIntegerField(blank=True)

class Media(models.Model):
    post = models.ForeignKey(Post)
    thumb = models.ImageField(upload_to='frontpage')
    fullImagePath = models.ImageField(upload_to='frontpage')

y a-t-il un moyen facile pour permettre à un utilisateur de créer une mise à jour sur une seule page?

Ce que je veulent est un utilisateur d'être en mesure d'aller à l'interface d'admin, ajouter une nouvelle mise à Jour, puis lors de l'édition d'une mise à Jour d'ajouter un ou plusieurs Postes, avec chaque Poste ayant un ou plusieurs articles dans les Médias. En outre, je veux que l'utilisateur soit en mesure de réorganiser les postes dans une mise à jour.

admin.py:

class MediaInline(admin.StackedInline):
    model = Media

class PostAdmin(admin.ModelAdmin):
    inlines = [MediaInline,]

cela permet à l'utilisateur d'ajouter un nouvel élément de poste, sélectionnez la mise à jour pertinente, ajouter les éléments médias à elle, et cliquez sur Enregistrer - ce qui est très bien. Mais il n'y a aucun moyen de voir tous les messages qui appartiennent à une mise à jour donnée dans un seul endroit, ce qui à son tour signifie que vous ne pouvez pas roder les messages dans une mise à jour. C'est vraiment assez déroutant pour l'utilisateur final.

à l'aide?

30
demandé sur Serjik 2010-09-10 03:17:47

5 réponses

a ce jour, il n'y a pas de manière "intégrée" d'avoir emboîté des lignes (inline inside inline) à django.contrib.admin. Tirer quelque chose comme ça est possible en ayant vos propres sous-classes ModelAdmin et InlineModelAdmin qui permettraient ce genre de fonctionnalité. Voir les taches sur ce billet http://code.djangoproject.com/ticket/9025 pour des idées sur la façon de le mettre en œuvre. Vous auriez également besoin de fournir vos propres modèles qui auraient imbriqué itération sur les deux le niveau supérieur en ligne et c'est enfant en ligne.

14
répondu Vasil 2010-09-19 10:37:38

il y a maintenant cet œuf disponible, qui est une compilation des taches pertinentes mentionnées dans l'autre réponse:

https://github.com/theatlantic/django-nested-admin

5
répondu GreenAsJade 2017-12-12 10:33:30

je viens de tombé sur cette question... Semble que ce fil qui contient la requête pour la caractéristique imbriquée inlines ( https://code.djangoproject.com/ticket/9025#no2 ) a été mis à jour avec de plus amples informations.

sur mesure application appelée "django-super-inline" a été libéré. Plus de détails ici: https://github.com/BertrandBordage/django-super-inlines

Installation et utilisation les instructions ci-dessous.

J'espère que c'est utile pour qui que ce soit.

enter image description here

3
répondu Aivoric 2015-07-30 13:03:14

j'ai rencontré un problème similaire. Mon approche était de faire une UpdateAdmin qui tenait en ligne pour les médias et le Post... il fait simplement en sorte que vous avez une liste de toutes les entrées de médias suivies par tous les messages dans une mise à jour.

class MediaInline(admin.StackedInline):
        model = Media

class PostInline(admin.StackedInline):
        model = Post

class PostAdmin(admin.ModelAdmin):
        inlines = [MediaInline,]

class UpdateAdmin(admin.ModelAdmin):
        inlines = [MediaInline,PostInline]

ce n'est pas une solution idéale mais cela fonctionne pour un travail rapide et sale autour.

2
répondu carruthd 2012-05-23 17:04:52

j'ai fait cela en utilisant https://github.com/theatlantic/django-nested-admin , pour la structure de données suivante:

  • concours
    • juges
    • candidats
      • Chanteurs
      • Chansons

Mon admin.py fichier:

from django.contrib import admin
import nested_admin

from .models import Contest, Contestant, Judge, Song, Singer    

class SongInline(nested_admin.NestedTabularInline):
    model = Song
    extra = 0

class SingerInline(nested_admin.NestedTabularInline):
    model = Singer
    extra = 0

class ContestantInline(nested_admin.NestedTabularInline):
    model = Contestant
    inlines = [SongInline, SingerInline]
    extra = 0

class JudgeInline(nested_admin.NestedTabularInline):
    model = Judge
    extra = 0

class ContestAdmin(nested_admin.NestedModelAdmin):
    model = Contest
    inlines = [ContestantInline, JudgeInline]
    extra = 0

admin.site.register(Contest, ContestAdmin)

https://github.com/theatlantic/django-nested-admin semble être beaucoup plus activement maintenu que les autres applications déjà mentionnées ( https://github.com/BertrandBordage/django-super-inlines et https://github.com/Soaa-/django-nested-inlines )

1
répondu Li-Wen Yip 2017-05-01 13:00:18