2013-08-19 5 views
5

J'ai un problème suivant.Django Inline Model Admin filtre Champ étranger

J'ai 3 modèles:

class Deal(models.Model): 
    name = models.CharField(max_length=80) 

class Site(models.Model): 
    name = models.CharField(max_length=80) 
    deal = models.ForeignKey(Deal) 

class Picture(models.Model): 
    title = models.CharField(max_length=80) 
    deal = models.ForeignKey(Deal) 
    site = models.ForeignKey(Site) 

Je veux faire affaire Administrateur avec Site & image modèles d'administration en ligne:

class SiteInline(admin.StackedInline): 
    model = Site 
    extra = 1 


class PictureInline(admin.StackedInline): 
    model = Picture 
    extra = 1 


class DealAdmin(admin.ModelAdmin): 
    inlines = [ 
     SiteInline, 
     PictureInline, 
    ] 

Ce que je veux faire est quand je suis Sélection du site dans l'image admin il montre seulement les sites que j'appartiens à l'affaire actuelle que je suis en train de regarder (si je suis en train de mettre à jour - ne pas en créer un nouveau).

Je veux que cela fonctionne en administrateur, j'ai passé de nombreuses heures à chercher sur le web mais je n'ai rien trouvé d'utile, merci de nous aider!

je tentais de le faire de cette façon, mais je ne sais pas comment accéder à l'instance de modèle parent pour obtenir l'identifiant de l'accord:

def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 

    if db_field.name == 'site': 
     kwargs['queryset'] = Site.objects.filter(deal__id=1) 

    return super(PictureInline, self).formfield_for_foreignkey(db_field, request=None, **kwargs) 

Répondre

0

Django: accessing the model instance from within ModelAdmin?

class PictureInlineForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(PictureInlineForm, self).__init__(*args, **kwargs) 
     self.fields['site'].queryset = Site.objects.filter(
      deal=self.instance.deal) 

class PictureInline(admin.ModelAdmin): 
    form = PictureInlineForm 
+0

'' 'PictureInline de classe (admin.ModelAdmin):' '' est-ce exact? Le créer et l'enregistrer avec Picture, ne donne aucun résultat, tout en ajoutant '' 'form = PictureInlineForm''' à la' '' class PictureInline (admin.StackedInline): '' 'nous obtenons l'erreur' '' L'image n'a pas d'affaire .''' – raratiru

1

Dans la variante de DTing Je vois le problème - self.instance.deal est mis en mode d'édition, mais il n'a pas activé le mode d'ajout

Je pense que vous devriez écrire

try:   
    self.fields['site'].queryset = Site.objects.filter(deal=self.instance.deal) 
except: 
    self.fields['site'].queryset = Site.objects 

à la place