I have a model `*Employee*` with a OneToOne relationship with `*User*`. I'm trying to include in the Employee admin some User fields (`*first_name, last_name, username, email*`), in order to edit those fields directly from the Employee Add/Change form, but I still haven't figured out how to do it.
I see another time do this kind of thing in a similar way, but now I have a fieldset error: `*Unknown field(s) (first_name) specified for Employee. Check fields/fieldsets/exclude attributes of class EmployeeAdmin*` here's the code: # FIELDSETS default_employee_fieldset = ( ('General', { 'fields': ( ('user', 'full_name',), ), }), # ..OTHER FIELDS NOT INCLUDED ) finance_fields_employee_fieldset = [ ('General', { 'fields': ( ('full_name',), ('first_name', 'last_name') ), }), # ..OTHER FIELDS NOT INCLUDED ] # ADMIN FORM class EmployeeAdminForm(forms.ModelForm): class Meta: model = Employee def __init__(self, *args, **kwargs): super(EmployeeAdminForm, self).__init__(*args, **kwargs) self.fields['first_name'] = forms.CharField(_('first name'), max_length=30, blank=True) self.fields['last_name'] = forms.CharField(_('last name'), max_length=30, blank=True) if 'instance' in kwargs: user = kwargs['instance'].user self.fields['first_name'].initial = user.first_name self.fields['last_name'].initial = user.last_name # MODEL ADMIN class EmployeeAdmin(ChaosDefaultAdmin): list_display = ('user', 'department', 'line_manager', 'acting_line_manager', 'jobtitle', 'office', 'payroll_id',) search_fields = ('user__username', 'user__first_name', 'user__last_name', 'line_manager__user__first_name', 'line_manager__user__last_name') list_filter = ('department', 'grade', 'clearance', 'office', 'user__is_active', 'user__is_staff', 'ready_for_paid_work') fieldsets = default_employee_fieldset def changelist_view(self, request, extra_context=None): extra_context = {'title': 'Employee details'} return super(EmployeeAdmin, self).changelist_view(request, extra_context) def change_view(self, request, object_id, form_url='', extra_context=None): if object_id: try: record = Employee.objects.get(id=object_id) extra_context = {'title': 'Edit employee record: %s' % (str(record),)} except (ValueError, Employee.DoesNotExist): pass # Generate a new CSRF token as this page contains sensitive data rotate_token(request) return super(EmployeeAdmin, self).change_view(request, object_id, form_url, extra_context) def queryset(self, request): qs = super(EmployeeAdmin, self).queryset(request) if request.user.is_superuser: return qs elif request.user.has_perm('myapp.change_all_employees'): if request.user.has_perm('myapp.change_ex_employees'): return qs.filter(user__is_staff=True) else: return qs.filter(user__is_staff=True, user__is_active=True) else: return qs.filter(user__is_staff=True, user__is_active=True).filter( Q(line_manager=request.user.employee) | Q(acting_line_manager=request.user.employee) | Q(user=request.user) ) def get_form(self, request, obj=None, *args, **kwargs): self.form = EmployeeAdminForm if obj: if request.user.has_perm('myapp.change_hr_employee_data'): self.readonly_fields = ('user', ) self.exclude = None self.fieldsets = finance_fields_employee_fieldset elif request.user.has_perm('myapp.change_employee_data_operations'): if request.user == obj.user: # set readonly fields self.exclude = None self.fieldsets = finance_fields_employee_fieldset else: # set readonly fields self.exclude = ('employer_pension_contribution', 'employee_pension_contribution',) self.fieldsets = default_employee_fieldset else: # if user is in AAA department and not employee's linemanager and not own record if request.user.employee.department == settings.DPTS['AAA'] if request.user == obj.user: # set readonly fields else: # set readonly fields self.exclude = ('account_number', 'sort_code', 'salary', 'employer_pension_contribution', 'employee_pension_contribution',) self.fieldsets = default_employee_fieldset else: # if user is editing his own record if request.user == obj.user: # set readonly fields self.exclude = ('account_reference', 'payroll_id',) self.fieldsets = finance_fields_employee_fieldset[0:-2] # if user is editing some for whom is line manager else: if request.user.employee == obj.line_manager or \ request.user.employee == obj.acting_line_manager: # set readonly fields self.fieldsets = default_employee_fieldset self.exclude = ('employer_pension_contribution', 'employee_pension_contribution',) else: self.readonly_fields = () self.exclude = () self.fieldsets = default_employee_fieldset form = super(EmployeeAdmin, self).get_form(request, *args, **kwargs) form.request = request return form def save_model(self, request, obj, form, change): if change: old_obj = Employee.objects.get(id=obj.id) if obj.jobtitle != old_obj.jobtitle: employee_detail_change_notification(obj, 'job title', obj.jobtitle.name) if obj.line_manager != old_obj.line_manager: employee_detail_change_notification(obj, 'line manager', obj.line_manager) if obj.acting_line_manager != old_obj.acting_line_manager: employee_detail_change_notification(obj, 'acting line manager', obj.acting_line_manager) if obj.home_address_line1 != old_obj.home_address_line1 or \ obj.home_address_line2 != old_obj.home_address_line2 or\ obj.home_address_line3 != old_obj.home_address_line3 or\ obj.home_address_city != old_obj.home_address_city or\ obj.home_address_postcode != old_obj.home_address_postcode or\ obj.home_address_country != old_obj.home_address_country or\ obj.home_address_phone != old_obj.home_address_phone or\ obj.personal_email != old_obj.personal_email: new_address = '%s\n%s\n%s\n%s\n%s\n%s\n\nPhone: %s\nEmail: %s' %( obj.home_address_line1, obj.home_address_line2, obj.home_address_line3, obj.home_address_city, obj.home_address_postcode, obj.get_home_address_country_display(), obj.home_address_phone, obj.personal_email, ) employee_detail_change_notification(obj, 'home address details', new_address) if obj.marital_status != old_obj.marital_status: employee_detail_change_notification(obj, 'marital_status', obj.get_marital_status_display()) obj.save() admin.site.register(Employee, EmployeeAdmin) Any help on this? Thanks LuKe -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/983051fd-a214-4a8d-b577-8370241f10f0%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.