2015-08-21 7 views
6

मैं इनलाइन मॉडल व्यवस्थापक से मूल उदाहरण कैसे प्राप्त कर सकता हूं?Django: इनलाइन मॉडल व्यवस्थापक से पेरेंट इंस्टेंस का उपयोग करें

मेरा लक्ष्य पेरेंट इंस्टेंस की स्थिति के आधार पर has_add_permission फ़ंक्शन को ओवरराइड करना है। मैं एक बच्चे को जोड़ने के लिए अनुमति देने के लिए नहीं करना चाहते हैं माता-पिता की स्थिति अलग से 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

क्या आपने request.parent.status को देखा? – fiacre

+0

'' WSGIRequest 'ऑब्जेक्ट में कोई विशेषता नहीं है' parent'' – Michael

+0

क्या आपको कुछ समाधान मिला? –

उत्तर

0

इसका उपयोग का उपयोग कर सकते है अगर parent_model

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

सभी मॉडल फ़ील्ड्स मूल्यों के बजाय "django.db.models.query_utils.DeferredAttribute" ऑब्जेक्ट लौटाते हैं! –

9

उपयोग Django के अनुरोध वस्तु (आपके पास कौन सा तक पहुंच) request.path_info पुनर्प्राप्त करने के लिए, फिर resolve मैच में तर्कों से पीके पुनर्प्राप्त करें। उदाहरण:

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

यह एकमात्र तरीका है जो यह काम करता है। अजीब बात है कि पैरेंट ऑब्जेक्ट तक पहुंच प्राप्त करना बहुत मुश्किल है। इस समाधान को खोजने में मुझे 1 घंटा लग गया। –

3

मुझे लगता है कि यह इनलाइन मॉडल में मूल उदाहरण प्राप्त करने का एक क्लीनर तरीका है।

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

मैं इसे काम करने के लिए नहीं मिल सकता है। मुझे "Parent_obj" मिल रहा है ChildInline की विशेषता नहीं है। –

+0

अजीब बात है, यह मेरे लिए काम करता है ... आप Django का कौन सा संस्करण उपयोग कर रहे हैं? –

+0

पायथन के तहत Django 1.10 2.7 –

संबंधित मुद्दे