Exemple #1
0
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.rel:
            _instance = db_field.rel.to()
            if hasattr(_instance, '__schema_name__') \
              and _instance.__schema_name__ == "SUBCLASSABLE":
                request = kwargs.pop('request', None)
                
                admin_site = self.admin_site
                if isinstance(db_field, related.ManyToManyField):
                    widget = MultiChoiceTypeWidget(db_field.rel, admin_site)
                else:
                    widget = SingleChoiceTypeWidget(db_field.rel, admin_site)
                
                kwargs['widget'] = widget
                return db_field.formfield(**kwargs)

        formfield = super(RelatedWidgetWrapperInline, self).formfield_for_dbfield(db_field, **kwargs)
        if (formfield and
            isinstance(formfield.widget, admin.widgets.RelatedFieldWidgetWrapper) and
            not isinstance(formfield.widget.widget, SelectMultiple)):
            request = kwargs.pop('request', None)
            related_modeladmin = self.admin_site._registry.get(db_field.rel.to)
            can_change_related = bool(related_modeladmin and
                                      related_modeladmin.has_change_permission(request))
            can_delete_related = bool(related_modeladmin and
                                      related_modeladmin.has_delete_permission(request))
            widget = RelatedFieldWidgetWrapper.from_contrib_wrapper(formfield.widget,
                                                                    can_change_related,
                                                                    can_delete_related)
            formfield.widget = widget
        return formfield
Exemple #2
0
 def formfield_for_dbfield(self, db_field, **kwargs):
     _hidden_fields = getattr(self, 'hidden_fields', None)
     _hidden_fields = _hidden_fields or []
     if db_field.name in _hidden_fields:
         widget = HiddenInput()
         kwargs['widget'] = widget
         kwargs['label'] = ''
     if db_field.rel:
         _instance = db_field.rel.to()
         if hasattr(_instance, '__schema_name__') \
           and _instance.__schema_name__ == "SUBCLASSABLE":
             request = kwargs.pop('request', None)
             
             admin_site = self.admin_site
             if isinstance(db_field, related.ManyToManyField):
                 widget = MultiChoiceTypeWidget(db_field.rel, admin_site)
             else:
                 widget = SingleChoiceTypeWidget(db_field.rel, admin_site)
             
             kwargs['widget'] = widget
             return db_field.formfield(**kwargs)
     
     # OneToOne fields are rendered with a HiddenInput instead a select.
     if isinstance(db_field, related.OneToOneField):
         attrs = {'id': 'id_{}'.format(db_field.name)}
         if db_field.rel:
             _instance = db_field.rel.to()
             if _instance.id:
                 attrs['value'] = _instance.id
         
         widget = HiddenInput(attrs=attrs)
         kwargs['widget'] = widget
     
     formfield = super(RelatedWidgetWrapperAdmin, self).formfield_for_dbfield(db_field, **kwargs)
     if (formfield and
         isinstance(formfield.widget, admin.widgets.RelatedFieldWidgetWrapper) and
         not isinstance(formfield.widget.widget, SelectMultiple)):
         request = kwargs.pop('request', None)
         related_modeladmin = self.admin_site._registry.get(db_field.rel.to)
         can_change_related = bool(related_modeladmin and
                                   related_modeladmin.has_change_permission(request))
         can_delete_related = bool(related_modeladmin and
                                   related_modeladmin.has_delete_permission(request))
         widget = RelatedFieldWidgetWrapper.from_contrib_wrapper(formfield.widget,
                                                                 can_change_related,
                                                                 can_delete_related)
         formfield.widget = widget
     return formfield