Django创建用户时自动生成Student模型及Admin面板字段整合
如何在Django Admin的用户创建面板中添加Student模型字段
当然可以实现,你只需要自定义Django Admin的用户管理类和创建表单,把Student的字段整合到用户创建页面里,具体操作如下:
1. 自定义用户创建表单
在admin.py中创建继承自UserCreationForm的自定义表单,将Student模型的字段添加进去:
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from .models import Student from django import forms from django.core.validators import MinValueValidator, MaxValueValidator class CustomUserCreationForm(UserCreationForm): # 添加Student的所有字段 birth = forms.DateField(required=True) street = forms.CharField(max_length=25, required=True) street_number = forms.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)], required=True) city = forms.CharField(max_length=20, required=True) province = forms.CharField(max_length=20, required=True) code = forms.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(9999)], required=True) class Meta: model = User fields = ('username', 'password1', 'password2', 'birth', 'street', 'street_number', 'city', 'province', 'code') def save(self, commit=True): # 先保存User实例(暂不提交数据库) user = super().save(commit=False) if commit: user.save() # 创建关联的Student实例 Student.objects.create( user=user, birth=self.cleaned_data['birth'], street=self.cleaned_data['street'], street_number=self.cleaned_data['street_number'], city=self.cleaned_data['city'], province=self.cleaned_data['province'], code=self.cleaned_data['code'] ) return user
2. 自定义UserAdmin类
重写UserAdmin,替换默认的添加表单和字段布局:
from django.contrib.auth.admin import UserAdmin from django.contrib import admin class CustomUserAdmin(UserAdmin): add_form = CustomUserCreationForm # 配置添加页面的字段分组 add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'password1', 'password2', 'birth', 'street', 'street_number', 'city', 'province', 'code'), }), ) # 注销默认UserAdmin,注册自定义的版本 admin.site.unregister(User) admin.site.register(User, CustomUserAdmin)
3. 验证效果
重启Django服务器后,进入/admin/创建用户时,就能看到Student的所有字段和用户基础字段显示在同一个页面中,提交表单后会自动创建对应的User和Student实例,完成一对一关联。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

