Search code examples
djangodjango-modelsdjango-admindefault-valueforeign-keys

django-admin formfield_for_* change default value per/depending on instance


I'm trying to change the default value of a foreignkey-formfield to set a Value of an other model depending on the logged in user. But I'm racking my brain on it...

This: Changing ForeignKey’s defaults in admin site would an option to change the empty_label, but I need the default_value.

#Now I tried the following without errors but it didn't had the desired effect:
class EmployeeAdmin(admin.ModelAdmin):
    ...

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        formfields = super(EmployeeAdmin, self).formfield_for_foreignkey(
            db_field, request, **kwargs
        )
    
        if request.user.is_superuser:
            return formfields
        if db_field.name == "company":
            # This is the RELEVANT LINE
            kwargs["initial"]  = request.user.default_company
        
        return db_field.formfield(**kwargs)

    
admin.site.register(Employee, EmployeeAdmin)

##################################################################
# REMAINING Setups if someone would like to know it but i think
# irrelevant concerning the problem
##################################################################
from django.contrib.auth.models import User, UserManager
class CompanyUser(User):
    ...
    objects = UserManager()
    company = models.ManyToManyField(Company)
    default_company= models.ForeignKey(Company, related_name='default_company')
    #I registered the CompanyUser instead of the standard User, 
    #   thats all up and working
    ...

class Employee(models.Model):
    company = models.ForeignKey(Company)
    ...

Hint: kwargs["default"] ... doesn't exist.

Thanks in advance, Nick


Solution

  • ok, the kwargs['initial'] thing worked the whole time but it just give a damn if you give it an object (like I did with: kwargs['initial'] = user.default_company). But it's working with an Integer.

    I solved it like this:

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        formfields= super(EmployeeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    
        if request.user.is_superuser:
            return formfields
    
        if db_field.name == "company":
            qs= request.user.company.all()
            #determine the default pos of configured default_company
            for index, item in enumerate(qs):
                if item==request.user.default_company:
                    kwargs["initial"]  = index+1
                    break
            #restrict shown entries in the ModelChoiceField
            kwargs["queryset"] = qs
    
    
        return db_field.formfield(**kwargs)
    

    Sorry for the stress and thanks for helping!