[英]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.