0

Whats the best way of excluding fieldsets, I have been reading different posts like the one's below :

  1. Question.

but I couldn't get it working with them. I want to negelect the following fieldsets when it's not superuser :

  • Cooperation Partner Settings.
  • email_user (This is an Inline not a field set)

Below is the admin.py code

@admin.register(CooperationPartner, site=admin_site)
    class CooperationPartnerAdmin(model.Admin):
    
        
    
        inline_type = 'stacked'
        inline_reverse = [(
            'email_user',
            {'fields': [
                'salutation', 'title', 'first_name', 'last_name', 'email',
            ]},
        )]
        reverse_delete_user = True
    
        form = CooperationPartnerAdminForm
    
        fieldsets_add = (
            (_('Personal Data'), {
                'fields': (
                    'birthday', 'private_address_street',
                    'private_address_house_n', 'private_address_extra',
                    'private_address_postcode', 'private_address_city',
                ),
            }),
            (_('Cooperation Partner Settings'), {
                'fields': (
                    'pool', 'custom_policy_type', 'custom_database_structure',
                    'custom_attachments',
                )
            }),
            (_('Company Data'), {
                'fields': (
                    'company', 'legal_form', 'business_address_street',
                    'business_address_house_n', 'business_address_extra',
                    'business_address_postcode', 'business_address_city',
                    'international_prefix', 'phone_number', 'career_position',
                    'loan_intermediary_permission', 'agreed_provision',
                    'bank_name', 'iban', 'bic', 'account_holder',
                    'sepa_direct_debit_mandate', 'status_decision_feedback',
                ),
            }),
        )
    
        fieldsets_change = (
            (None, {
                'fields': (
                    'cooperation_partner_id', 'account_state',
                ),
            }),
        ) + fieldsets_add
    
        def get_form(self, request, obj=None, change=False, **kwargs):
            """Overwrite get_form method."""
            self.fieldsets = self.fieldsets_change if obj else self.fieldsets_add
            return super().get_form(request, obj, change, **kwargs)

EDIT :

This is my current implementation according to the answer @Ozahed,

but it doesn't make fields hidden, whats really missing :

    def get_form(self, request, obj=None, change=False, **kwargs):
        """Overwrite get_form method."""
        self.fieldsets = self.fieldsets_change if obj else self.fieldsets_add
        form = super().get_form(request, obj, change, **kwargs)
        if request.user.is_staff:
            list_of_fields_to_hide = ['pool', 'custom_policy_type', 'birthday']
            for field_name in list_of_fields_to_hide:
                form.base_fields[field_name].is_hidden = True
        return super().get_form(request, obj, change, **kwargs)
    

Lutaaya Huzaifah Idris
  • 3,596
  • 8
  • 38
  • 77

1 Answers1

0

Each Django Form has a dictionary called base_fields that contains Field Classes and would be accessible after the super().get_form call. each field has its properties that we can control like widget instance. in your case, inside get_forms based on the request's user you might change the field's disabled or widget itself

from django.forms.widgets import HiddenInput

def get_form (self, request, obj=None, change=False, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    if not request.user.is_superuser: 

       for field_name in list_of_fields_to_hide:
           form.base_fields[field_name].widget = HiddenInput()
       
    return form

Django Field API documents

OZahed
  • 464
  • 5
  • 11