12
votes

Django LIMITER PLUSTOMANY QUERYSET BASE DE SOCIÉE DE FK

J'ai un modèle qui ressemble à ceci: XXX

Donc, chaque fois qu'un nouvel événement est créé, un groupe de rôles est créé avec elle. Dans le modèle Invite, comment puis-je indiquer uniquement les rôles associés à l'événement que j'ai sélectionné dans le formulaire de modification de Django admin au lieu de montrer toutes les entrées dans le modèle de rôle?


0 commentaires

4 Réponses :


1
votes

Vous devez fournir une coutume formfield_for_forignkey code> méthode dans votre classe d'administration pour le modèle.

Cet exemple (de la documentation que j'ai liée), devriez vous aider à démarrer: p>

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "car":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)


2 commentaires

Cela sera fait à l'heure de la charge et son non dynamique. Je crois que les cohutes doivent être filtrés de manière dynamique. C'est ce que la question semble à propos.


@Pannu: Non, ceci est réellement proche de la solution correcte, mais pour résoudre ce problème particulier, vous devez accéder à l'instance Invitation en question.



8
votes

Vous souhaitez filtrer de manière dynamique les choix des rôles code> code> code>, vous aurez donc besoin ajax code> pour effectuer cette tâche.

Voici Comment vous pouvez faire ce travail .. p>

1: strong> Onchange code> de l'événement code> code> Envoyer le event_id Code> à votre personnalisé Affichage code> via Ajax code>. p>

2: strong> à partir des rôles code> modèle code> Filtre CODE> basé sur le Event_ID CODE> Vous avez reçu de la requête CODE> AJAX CODE> et renvoyez les rôles code> par code> par Serializing dans json code>. P>

3: strong> Effacer les rôles code> existants CODE> et repeuplez-vous en analysant la réponse code> JSON CODE>. P>

Par exemple: Ceci a jQuery code> getjson code> Exemple p>

JavaScript: strong> p>

def my_view(request,event_id):
    qs = Role.objects.filter(event=event_id).values_list('id')
    return HttpResponse(simplejson.dumps(qs),mimetype='application/javascript')


2 commentaires

La solution a besoin de script Java car lorsqu'il choisit l'événement dans le formulaire, les rôles doivent être filtrés de manière dynamique (sans appuyer sur une touche, soumettant tout le formulaire, puis revenir avec les choix filtrés), donc AJAX est la voie à suivre.


Oui, si vous souhaitez que cela change dans le navigateur lorsque vous modifiez l'événement sélectionné dans le widget, vous devez bien sûr utiliser JavaScript. Désolé, j'ai mal interprété.



9
votes

Vous voulez probablement quelque chose dans les lignes de: xxx

Documentation Django pour formfield_for_manytomany


2 commentaires

La question indique clairement «Comment puis-je indiquer uniquement les rôles associés à l'événement que j'ai sélectionné dans le formulaire modifier " qui est définitivement fait dynamique (Ajax). Votre solution est statique.


Ah, j'ai raté ce détail, merci. Je n'appellerais pas nécessairement cela une solution static tel qu'il varie en fonction de l'objet chargé et de l'événement sélectionné dans la base de données, mais je pense que vous avez raison cela ne résout pas le problème en fait Être présenté :)



1
votes

Je crois qu'il y a deux façons de résoudre ce problème:

  1. méthode Ajax comme décrit par @pannu

  2. Méthode non AJAX pouvant être obtenue en déplaçant le champ Event en dehors du formulaire de modification (ce qui signifie qu'il y aurait un autre formulaire pour modifier événement ) et Filtrage Rôles en fonction de l'événement actuel . Je devais résoudre récemment un problème similaire avec la limitation des options disponibles en fonction de l'appartenance d'un objet à un site spécifique. Voici une description et code, si vous êtes intéressé: http: // source.mihelac.org/2011/09/8/django-sites-ext/


0 commentaires