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