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
I think the
db_field.formfield
method (which is also called by the admin btw) always overwrites your inital value with the default value specified in the model! So you need to specify the right form field yourself:You could also do this customization in a custom form's init, but the problem is, that you cannot access
request
normally in a form class, but you can see my hack here Django: How to get current user in admin forms on how to get the current user object into the form!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:
Sorry for the stress and thanks for helping!