简体   繁体   English

使用OneToOneField扩展Django Admin UserCreationForm

[英]Extend Django Admin UserCreationForm with OneToOneField

I'm trying to extend the django admin UserCreationForm to include a field from another table related on a OneToOneField. 我正在尝试扩展django管理员UserCreationForm以包括来自另一个与OneToOneField相关的表的字段。

This is my related table: 这是我的相关表格:

class Profile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE
    )
    supervisor = models.ForeignKey(
        User,
        related_name='supervisor',
        on_delete=models.DO_NOTHING,
        blank = True,
        null = True
    )

And my admin form: 和我的管理表格:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
from django import forms

class EmailRequiredMixin(object):
    def __init__(self, *args, **kwargs):
        super(EmailRequiredMixin, self).__init__(*args, **kwargs)
        # make user email field required
        self.fields['email'].required = True


class MyUserCreationForm(EmailRequiredMixin, UserCreationForm):
    supervisor = forms.Select()

    class Meta:
        model = User
        fields = ['username',]

    def save(self, commit=True):
        if not commit:
            raise NotImplementedError("Can't create User and UserProfile without database save")
        user = super(MyUserCreationForm, self).save(commit=True)
        profile = Profile(user=user, supervisor=self.cleaned_data['supervisor'])
        profile.save()
        return user, profile

class EmailRequiredUserAdmin(UserAdmin):
    inlines = [ProfileInline, ]
    list_display = ['username', 'email', 'first_name', 'last_name', 'is_staff', 'get_supervisor', 'get_is_supervisor', 'get_is_project_manager']
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    add_fieldsets = ((None, {'fields': ('username', 'email',
                                        'password1', 'password2'), 'classes': ('wide',)}),)

    def get_supervisor(self, instance):
        return instance.profile.supervisor
    get_supervisor.short_description = 'Supervisor'

    def get_is_supervisor(self, instance):
        return instance.profile.is_supervisor()
    get_is_supervisor.short_description = 'Is Supervisor'

    def get_is_project_manager(self, instance):
        return instance.profile.is_project_manager()
    get_is_project_manager.short_description = 'Is Project Manager'

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(EmailRequiredUserAdmin, self).get_inline_instances(request, obj)

admin.site.unregister(User)
admin.site.register(User, EmailRequiredUserAdmin)

Within django-admin it just shows the normal creation form but I need to include the supervisor. 在django-admin中,它仅显示正常的创建表单,但我需要包括主管。 I know I haven't included the queryset for the supervisor at this stage, but I think this explains what I'm trying to achieve and what I've attempted. 我知道我在这个阶段还没有包括主管的查询集,但是我认为这可以解释我正在尝试实现的目标和尝试完成的目标。

Would appreciate help. 希望能有所帮助。

You also need to add supervisor field to your admin add_fieldsets. 您还需要将超级用户字段添加到您的管理员add_fieldsets中。

class MyTestForm(UserCreationForm):
    supervisor = forms.ModelChoiceField(queryset=User.objects)

    def save(self, commit=True):
        supervisor = self.cleaned_data['supervisor']
        # Save user first 
        user = super(MyTestForm, self).save(commit=True)
        profile = Profile.objects.create(user=user)
        profile.supervisor = supervisor
        profile.save()
        return user


class MyUserAdmin(UserAdmin):
    add_form = MyTestForm
    form = UserChangeForm
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('supervisor', 'username', 'password1', 'password2')
        }),
    )

I tested this solution and supervisor shows up as dropdown in the create step. 我测试了此解决方案,主管在创建步骤中显示为下拉列表。 Hope it helps. 希望能帮助到你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM