0

I want to change a names of items (users) in drop down list in Django Admin Model. I want to do it without any changes in basic models.

I just want to field 'user'(admin.py) refers to 'user' in Worker model(office.py) through username (just without Firstname and Lastname)

admin.py

from .models import Token

class TokenAdmin(admin.ModelAdmin):
    model = Token

    fieldsets = (
        (None, {
            'fields': ('name', 'key', 'user')
        }),

models.py

from office.models import Worker

class Token(models.Model):
    user = models.ForeignKey(
            Worker,
            related_name='auth_token',
            verbose_name=_("api.models.token.user")
        )

office.py

class Worker(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name=_("User"))
    firstname = models.CharField(
        _("Firstname"), blank=False, null=False, max_length=50)
    lastname = models.CharField(
        _("Lastname"), blank=False, null=False, max_length=50)

    def __str__(self):
        return "%s %s" % (self.lastname, self.firstname)
dzierzak
  • 79
  • 10

1 Answers1

1

I have solved it!

admin.py

class UserChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.user

class TokenAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == 'user':
            kwargs['form_class'] = UserChoiceField
        return super(TokenAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
dzierzak
  • 79
  • 10