2015-08-16 31 views
8

Profile में PointField शामिल है। मैं ProfileAdmin, यहाँ में OSMGeoAdmin उपयोग किया है:GeoDjango: क्या मैं उपयोगकर्ता व्यवस्थापक में इनलाइन में OSMGeoAdmin का उपयोग कर सकता हूं?

class ProfileAdmin(admin.OSMGeoAdmin): 
    model = Profile 

लेकिन समझ नहीं कैसे UserAdmin में प्रदर्शन के लिए एक इनलाइन में इसका उपयोग करना। मेरे पास वर्तमान में यह सेट अप है:

# User Admin, with Profile attached 
class ProfileInline(admin.StackedInline): 
    model = Profile 
    can_delete = False 
    verbose_name_plural = 'Profile' # As only one is displayed in this view 

class UserAdmin(UserAdmin): 
    inlines = (
     ProfileInline, 
    ) 

admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

क्या इस स्थिति में कक्षा OSMGeoAdmin का उपयोग करना संभव है?

उत्तर

4

यह अनुमान लगाने का अनुरोध करने के लिए यह एक अच्छी सुविधा होगी।

एक कामकाज के रूप में, आप इस तथ्य का लाभ उठा सकते हैं कि InlineModelAdminModelAdmin के समान है। दोनों BaseModelAdmin का विस्तार करते हैं।

StackedInline और ModelAdmin दोनों से प्रवेश करना बहुत अधिक संघर्ष नहीं करना चाहिए।

एकमात्र मुद्दा यह है कि __init__() विधियों में 2 स्थितित्मक तर्क लेते हैं और बिना तर्क के super().__init__() पर कॉल करें। तो जो कुछ भी विरासत के क्रम में, यह TypeError: __init__() missing 2 required positional arguments: 'parent_model' and 'admin_site'

सौभाग्य से, InlineModelAdmin.__init__() विधि, एक हम में रुचि रखते हैं साथ विफल हो जाएगा, वास्तव में अत्यधिक शब्द है और न ही जटिल (बहुत ज्यादा नहीं झरना में super().__init__() कॉल) नहीं है।

def __init__(self, parent_model, admin_site): 
    self.admin_site = admin_site 
    self.parent_model = parent_model 
    self.opts = self.model._meta 
    self.has_registered_model = admin_site.is_registered(self.model) 
    super(InlineModelAdmin, self).__init__() 
    if self.verbose_name is None: 
     self.verbose_name = self.model._meta.verbose_name 
    if self.verbose_name_plural is None: 
     self.verbose_name_plural = self.model._meta.verbose_name_plural 

और यहाँ है क्या अपनी मूल (BaseModelAdmin) in Django 1.9

def __init__(self): 
    overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy() 
    overrides.update(self.formfield_overrides) 
    self.formfield_overrides = overrides 

अब कैसा लग रहा है की यह सब एक साथ रखा है::

from django.contrib.admin.options import FORMFIELD_FOR_DBFIELD_DEFAULTS 

# User Admin, with Profile attached 
class ProfileInline(OSMGeoAdmin, admin.StackedInline): 
    model = Profile 
    can_delete = False 
    verbose_name_plural = 'Profile' # As only one is displayed in this view 

    def __init__(self, parent_model, admin_site): 
     self.admin_site = admin_site 
     self.parent_model = parent_model 
     self.opts = self.model._meta 
     self.has_registered_model = admin_site.is_registered(self.model) 
     overrides = FORMFIELD_FOR_DBFIELD_DEFAULTS.copy() 
     overrides.update(self.formfield_overrides) 
     self.formfield_overrides = overrides 
     if self.verbose_name is None: 
      self.verbose_name = self.model._meta.verbose_name 
     if self.verbose_name_plural is None: 
      self.verbose_name_plural = self.model._meta.verbose_name_plural 

class UserAdmin(UserAdmin): 
    inlines = (
     ProfileInline, 
    ) 

admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

यहाँ यह क्या लग रहा है in Django 1.9 की तरह है

यह वास्तव में एक संतोषजनक समाधान नहीं है django से कुछ कोड कॉपी/पेस्ट करने की आवश्यकता है, जो आपके द्वारा उपयोग किए जाने वाले Django के संस्करण के भीतर अलग हो सकती है, और Django को अपग्रेड करते समय बनाए रखने के लिए दर्द हो सकता है। हालांकि इसे तब तक काम करना चाहिए जब तक कि इसे Django में मिश्रित या InlineModelAdmin के रूप में शामिल न किया जाए।

ध्यान दें: ऊपर कोड के टुकड़े Django 1.9 से लिया जाता है, तो आप GitHub टैग के टुकड़े अपने संस्करण के लिए इसी को खोजने के लिए ब्राउज़ करना चाहिए।

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

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