यह अनुमान लगाने का अनुरोध करने के लिए यह एक अच्छी सुविधा होगी।
एक कामकाज के रूप में, आप इस तथ्य का लाभ उठा सकते हैं कि InlineModelAdmin
ModelAdmin
के समान है। दोनों 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 टैग के टुकड़े अपने संस्करण के लिए इसी को खोजने के लिए ब्राउज़ करना चाहिए।