2010-12-08 45 views
1

J'ai des modèles interdépendants qui doivent coexister sur une même page d'administration. Voici l'idée:Formulaires en ligne admin de Django - limite le jeu de requêtes de clés étrangères à un ensemble de valeurs

Les productions théâtrales ont des acteurs et les acteurs ont des rôles spécifiques. Une production théâtrale est liée à un texte écrit donné (jeu, adaptation, etc.), et le texte écrit contient une liste de tous les rôles pour ce texte. Lors de l'ajout d'une production, chaque acteur doit être associé à l'un de ces rôles.

Voilà comment le modèle de données fonctionne:

Modèles: Production, personne, castmember, rôle, WrittenText

Relations: Production et personne ont une relation M2M à travers castmember, ce qui ajoute un champ "rôle" - une ForeignKey à un objet Role. Rôle lui-même a un ForeignKey à un objet WrittenText. Donc, le problème est le suivant: dans la page d'administration pour Productions, j'ai une TabularInline pour ajouter CastMembers. Les entrées CastMember de la table doivent avoir leur champ 'role' limité aux seuls rôles spécifiés dans WrittenText que les références de production.

J'ai fait une solution à mi-chemin au problème en remplaçant le formulaire modèle:

class CastMemberForm(ModelForm): 
    class Meta: 
     model = CastMember 

    def __init__(self, *args, **kwargs): 
     super(CastMemberForm, self).__init__(*args, **kwargs) 
     if 'instance' in kwargs: 
     self.fields['role'].queryset = Role.objects.filter(source_text=self.instance.production.source_text) 

Mais, cela ne fonctionne que si vous choisissez une personne de la liste déroulante, enregistrer, puis choisissez le rôle - sinon vous obtenez juste une liste de tous les rôles. Sortir "if" instance "dans kwargs" me donne un DoesNotExistError.

Est-ce simplement trop compliqué à faire sans quelque chose comme JS côté client, ou existe-t-il une solution plus simple qui me manque?

+0

Avez-vous trouvé une solution à ce problème? Je suis confronté au même problème:/ –

Répondre

0

Here est un exemple de boîtes de sélection chaînées via javascript/ajax. Il devrait fondamentalement être le même principe, mais vous devriez avoir besoin de tweak les js pour ne pas mettre à jour une boîte de sélection, mais tous dans l'admin inline ... Peut-être que cela vous donne une petite inspiration!

+0

Merci pour l'astuce, mais je n'ai même pas besoin de faire quoi que ce soit conditionnellement - les formulaires dans l'inline n'ont même pas de menu déroulant pour Production, il est entièrement basé sur l'objet parent. J'ai travaillé avec ceci: http://www.stereoplex.com/blog/filtering-dropdown-lists-in-the-django-admin mais cela ne m'amène pas plus loin que ce que j'avais avant. Toujours en train de travailler dessus, j'espère pouvoir poster une réponse ici assez tôt. :) –