2015-08-21 14 views
6

Wie kann ich über den Inline-Modelladministrator auf die Elterninstanz zugreifen?Django: Zugriff auf die Elterninstanz über das Inline-Modell admin

Mein Ziel ist es, die has_add_permission-Funktion basierend auf dem Status der übergeordneten Instanz zu überschreiben. Ich will nicht erlauben, ein Kind hinzuzufügen, wenn der Status der Eltern anders als 1.

class ChildInline(admin.TabularInline): 
    model = Child 
    form = ChildForm 

    fields = (
     ... 
    ) 
    extra = 0 

    def has_add_permission(self, request): 
     # Return True only if the parent has status == 1 
     # How to get to the parent instance? 
     #return True 

class ParentAdmin(admin.ModelAdmin): 
    inlines = [ChildInline,] 
+0

Haben Sie sich request.parent.status angesehen? – fiacre

+0

''WSGIRequest' Objekt hat kein Attribut 'Eltern' ' – Michael

+0

Haben Sie eine Lösung gefunden? –

Antwort

0

Sie es zugreifen können parent_model

def has_add_permission(self, request): 
    if self.parent_model is YourModel 
     .. 
+0

Alle Modellfelder geben "django.db.models.query_utils.DeferredAttribute" -Objekte anstelle von Werten zurück! –

9

Verwenden Djangos Request-Objekt (die Sie haben Zugriff auf), um die request.path_info abzurufen, dann die PK aus den Argumenten in der resolve Übereinstimmung abrufen. Beispiel:

from django.contrib import admin 
from django.core.urlresolvers import resolve 
from app.models import YourParentModel, YourInlineModel 


class YourInlineModelInline(admin.StackedInline): 
    model = YourInlineModel 

    def get_parent_object_from_request(self, request): 
     """ 
     Returns the parent object from the request or None. 

     Note that this only works for Inlines, because the `parent_model` 
     is not available in the regular admin.ModelAdmin as an attribute. 
     """ 
     resolved = resolve(request.path_info) 
     if resolved.args: 
      return self.parent_model.objects.get(pk=resolved.args[0]) 
     return None 

    def has_add_permission(self, request): 
     parent = self.get_parent_object_from_request(request) 

     # Validate that the parent status is active (1) 
     if parent: 
      return parent.status == 1 

     # No parent - return original has_add_permission() check 
     return super(YourInlineModelInline, self).has_add_permission(request) 


@admin.register(YourParentModel) 
class YourParentModelAdmin(admin.ModelAdmin): 
    inlines = [YourInlineModelInline] 
+0

dies ist die einzige Möglichkeit, wie es funktioniert. Seltsam, dass es so schwer ist, Zugriff auf das Elternobjekt zu bekommen. Ich brauchte eine Stunde, um diese Lösung zu finden. –

3

Ich denke, dies ist eine sauberere Möglichkeit, die übergeordnete Instanz im Inline-Modell zu erhalten.

class ChildInline(admin.TabularInline): 
    model = Child 
    form = ChildForm 

    fields = (...) 
    extra = 0 

    def get_formset(self, request, obj=None, **kwargs): 
     self.parent_obj = obj 
     return super(ChildInline, self).get_formset(request, obj, **kwargs) 

    def has_add_permission(self, request): 
     # Return True only if the parent has status == 1 
     return self.parent_obj.status == 1 


class ParentAdmin(admin.ModelAdmin): 
    inlines = [ChildInline, ] 
+0

Ich kann das nicht so wie es ist arbeiten. Ich bekomme "Parent_obj" ist kein Attribut von ChildInline. –

+0

Das ist komisch, es funktioniert für mich ... Welche Version von Django benutzt du? –

+0

Django 1.10 unter Python 2.7 –

Verwandte Themen