簡體   English   中英

使用OneToOneField擴展Django Admin UserCreationForm

[英]Extend Django Admin UserCreationForm with OneToOneField

我正在嘗試擴展django管理員UserCreationForm以包括來自另一個與OneToOneField相關的表的字段。

這是我的相關表格:

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
    )

和我的管理表格:

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)

在django-admin中,它僅顯示正常的創建表單,但我需要包括主管。 我知道我在這個階段還沒有包括主管的查詢集,但是我認為這可以解釋我正在嘗試實現的目標和嘗試完成的目標。

希望能有所幫助。

您還需要將超級用戶字段添加到您的管理員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')
        }),
    )

我測試了此解決方案,主管在創建步驟中顯示為下拉列表。 希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM