Skip to main content
 首页 » 编程设计

python之扩展 Django 用户模型后创建新用户

2025年05月04日27birdshome

似乎无法找到明确回答我的问题的答案。

如果您使用如下基本代码扩展 Django 用户模型:

class Employee(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    department = models.CharField(max_length=100) 

这对创建新用户有何影响?创建新用户时是否自动创建 employee 类对象?如果需要department字段,如何同时创建用户对象和员工对象?

请您参考如下方法:

如果您希望在创建用户时创建雇员实例,您可以使用 django 信号,它会在创建新用户时自动创建实例。

模型.py

from django.db.models.signals import * 
from __future__ import unicode_literals 
 
class Employee(models.Model): 
 
    userName = models.OneToOneField(User, related_name='profile') 
    department = models.CharField(max_length=100, null=True) 
 
    def __unicode__(self):  # __str__ 
        return unicode(self.userName) 
 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
    Employee.objects.create(userName=instance) 
 
post_save.connect(create_user_profile, sender=User) 

这将在创建新用户时自动创建一个员工实例(可以在后面添加空白实例数据)。

如果您希望扩展用户模型并希望在创建用户时添加更多信息,您可以使用 django-betterforms (http://django-betterforms.readthedocs.io/en/latest/multiform.html)

模型.py

from django.db.models.signals import * 
from __future__ import unicode_literals 
 
class Employee(models.Model): 
 
    userName = models.OneToOneField(User, related_name='profile') 
    department = models.CharField(max_length=100) 
 
    def __unicode__(self):  # __str__ 
        return unicode(self.userName) 

表格.py

from django import forms 
from django.forms import ModelForm 
from betterforms.multiform import MultiModelForm 
from django.contrib.auth.forms import UserCreationForm 
from .models import * 
 
class EmployeeForm(ModelForm): 
 
    class Meta: 
        model = Employee 
        exclude = ('userName',) 
 
 
class addEmployeeMultiForm(MultiModelForm): 
    form_classes = { 
        'user':UserCreationForm, 
        'profile':EmployeeForm, 
    } 

View .py

from django.views.generic import CreateView 
from django.shortcuts import redirect 
from .models import * 
from .forms import * 
 
class addEmployee(CreateView): 
    form_class = addEmployeeMultiForm 
    template_name = "addEmployee.html" 
    success_url = '/your url after user created' 
 
    def form_valid(self, form): 
        user = form['user'].save() 
        profile = form['profile'].save(commit=False) 
        profile.userName = User.objects.get(username= user.username) 
        profile.save() 
        return redirect(self.success_url) 

网址.py

from .views import * 
 
           urlpatterns = [ 
                 url(r'^addemp/$', addEmployee.as_view(), name='addemp'), 
           ] 

addEmployee.html

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>Title</title> 
    </head> 
    <body> 
        <form action="." method="post"> 
            {% csrf_token %} 
            {{ form }}      
            <button type="submit">Add</button> 
        </form> 
     </body> 
</html>