2015-08-21 5 views
6

Come posso accedere all'istanza padre dall'admin modello in linea?Django: accedi all'istanza genitore dal modello Inline admin

Il mio obiettivo è sovrascrivere la funzione has_add_permission in base allo stato dell'istanza padre. Non voglio per consentire di aggiungere un bambino, se lo stato del genitore è diverso da 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

hai cercato request.parent.status? – fiacre

+0

L'oggetto '' WSGIRequest 'non ha attributo' padre ' – Michael

+0

Hai trovato qualche soluzione? –

risposta

0

è possibile accedervi utilizzando parent_model

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

Tutti i campi del modello restituiscono oggetti "django.db.models.query_utils.DeferredAttribute" anziché valori! –

9

Richiesta oggetto Usa Django (che avete accesso a) per recuperare lo request.path_info, quindi recuperare il PK dagli args nella partita resolve. Esempio:

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

questo è l'unico modo in cui funziona. Strano che sia così difficile accedere all'oggetto genitore. Mi ci è voluta 1 ora per trovare questa soluzione. –

3

Penso che questo sia un modo più semplice per ottenere l'istanza genitore nel modello in linea.

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

Non riesco a farlo funzionare così com'è. Sto diventando "Parent_obj" non è un attributo di ChildInline. –

+0

Questo è strano, funziona per me ... Quale versione di Django stai usando? –

+0

Django 1.10 sotto Python 2.7 –