अनुकूलित व्यवस्थापक रूपों के निर्माण के लिए हमने एक नई कक्षा को परिभाषित किया है जिसे मिश्रित के रूप में उपयोग किया जा सकता है।
ModelAdmin: एक fieldset सभी क्षेत्रों
युक्त
ModelForm को परिभाषित: दृष्टिकोण काफी लचीला है संकीर्ण क्षेत्रों दिखाया जा रहा
FlexibleModelAdmin: अधिभावी ModelAdmin की get_fieldsets-विधि; एक कम fieldset कि केवल व्यवस्थापक प्रपत्र
class FlexibleModelAdmin(object):
'''
adds the possibility to use a fieldset as template for the generated form
this class should be used as mix-in
'''
def _filterFieldset(self, proposed, form):
'''
remove fields from a fieldset that do not
occur in form itself.
'''
allnewfields = []
fields = form.base_fields.keys()
fieldset = []
for fsname, fdict in proposed:
newfields = []
for field in fdict.get('fields'):
if field in fields:
newfields.append(field)
allnewfields.extend(newfields)
if newfields:
newentry = {'fields': newfields}
fieldset.append([fsname, newentry])
# nice solution but sets are not ordered ;)
# don't forget fields that are in a form but were forgotten
# in fieldset template
lostfields = list(set(fields).difference(allnewfields))
if len(lostfields):
fieldset.append(['lost in space', {'fields': lostfields}])
return fieldset
def get_fieldsets(self, request, obj=None):
'''
Hook for specifying fieldsets for the add form.
'''
if hasattr(self, 'fieldsets_proposed'):
form = self.get_form(request, obj)
return self._filterFieldset(self.fieldsets_proposed, form)
else:
return super(FlexibleModelAdmin, self).get_fieldsets(request, obj)
व्यवस्थापक मॉडल आप fieldsets_proposed परिभाषित जो टेम्पलेट के रूप में कार्य करता है और सभी क्षेत्रों में शामिल है में में परिभाषित फ़ील्ड हैं देता है।
class ReservationAdmin(FlexibleModelAdmin, admin.ModelAdmin):
list_display = ['id', 'displayFullName']
list_display_links = ['id', 'displayFullName']
date_hierarchy = 'reservation_start'
ordering = ['-reservation_start', 'vehicle']
exclude = ['last_modified_by']
# considered by FlexibleModelAdmin as template
fieldsets_proposed = (
(_('General'), {
'fields': ('vehicle', 'reservation_start', 'reservation_end', 'purpose') # 'added_by'
}),
(_('Report'), {
'fields': ('mileage')
}),
(_('Status'), {
'fields': ('active', 'editable')
}),
(_('Notes'), {
'fields': ('note')
}),
)
....
def get_form(self, request, obj=None, **kwargs):
'''
set the form depending on the role of the user for the particular group
'''
if request.user.is_superuser:
self.form = ReservationAdminForm
else:
self.form = ReservationUserForm
return super(ReservationAdmin, self).get_form(request, obj, **kwargs)
admin.site.register(Reservation, ReservationAdmin)
अपने मॉडल रूपों में अब आप फ़ील्ड को बाहर/शामिल करने के लिए परिभाषित कर सकते हैं। mixin-class के get_fieldset() यह सुनिश्चित करता है कि केवल फ़ॉर्म में परिभाषित फ़ील्ड लौटाए जा रहे हैं।
class ReservationAdminForm(ModelForm):
class Meta:
model = Reservation
exclude = ('added_by', 'last_modified_by')
class ReservationUserForm(BaseReservationForm):
class Meta:
model = Reservation
fields = ('vehicle', 'reservation_start', 'reservation_end', 'purpose', 'note')
क्या आपने पेजऑप्शन क्लास में कहीं भी फ़ील्डसेट घोषित करने का प्रयास किया है, यह देखने के लिए कि क्या यह काम करता है? –
हाँ, यह शो कोई फर्क नहीं पड़ता कि get_form –