Python (扩展)用户表格

Python (扩展)用户表格,python,django,Python,Django,我扩展了我的用户模型并添加了一些额外的字段。我希望能够通过web界面(而不是管理页面)添加新用户,因此它需要一些表单。我如何在数据库中创建这个新用户,表单是什么样子的 class MyUser(models.Model): user = models.OneToOneField(User) custcode = models.CharField(max_length=30) //这显然不起作用,但这是一个开始 from django.contrib.auth.for

我扩展了我的用户模型并添加了一些额外的字段。我希望能够通过web界面(而不是管理页面)添加新用户,因此它需要一些表单。我如何在数据库中创建这个新用户,表单是什么样子的

class MyUser(models.Model):
     user     = models.OneToOneField(User)
     custcode = models.CharField(max_length=30)
//这显然不起作用,但这是一个开始

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class UserCreateForm(UserCreationForm):

    class Meta:
        model = User
        fields = ('username', 'custcode')

你可以这样做

class UserCreateForm(UserCreationForm):
    custcode = form.CharField()

    class Meta:
        model = User
        fields = ('username', 'custcode')
def save(self, commit=True):
    user = super(UserCreateForm, self).save(commit=True)
    myuser = MyUser.objects.get_or_create(user=user)[0]
    myuser.save()
然后像这样为表单编写自定义保存函数

class UserCreateForm(UserCreationForm):
    custcode = form.CharField()

    class Meta:
        model = User
        fields = ('username', 'custcode')
def save(self, commit=True):
    user = super(UserCreateForm, self).save(commit=True)
    myuser = MyUser.objects.get_or_create(user=user)[0]
    myuser.save()

因为你有两个模型,你需要两种形式

一个表单用于
auth.User
,另一个表单用于
yourapp.MyUser

在您看来,您将:

  • 实例化这两种形式
  • 检查两个表格是否有效
  • 保存用户表单
  • 使用user.pk保存MyUser表单
  • 这应该是这样的

    class MyUserCreationForm(forms.ModelForm):
        class Meta:
            model = User
            exclude = ('user',)
            # Exclude 'user' because we will set it manually
    
    class MyView(View):
    
        def get(self, request):
            user_form = UserCreationForm(prefix='user')
            myuser_form = MyUserCreationForm(prefix='myuser')
            # Use prefix to avoid name conflicts
            return render(...)
    
        def post(self, request):
            user_form = UserCreationForm(request.POST, prefix='user')
            myuser_form = MyUserCreationForm(request.POST, prefix='myuser')
            user_form_is_valid = user_form.is_valid()
            myuser_form_is_valid = myuser_form.is_valid()
            # Do form.is_valid() here in order to always call both
            if user_form_is_valid and myuser_form_is_valid:
                user = user_form.save()
                myuser = myuser_form.save(commit=False)
                myuser.user = user
                myuser.save()
                ...
            ...
            return ...
    

    为了保持一致性,表单保存也应包含在事务中。但这是另一个主题。

    get\u或_create()
    返回
    tuple
    ,不能
    save()
    对象。如果扩展用户中只有一个或两个额外字段,则此解决方案非常简单。但是,如果您有更多字段,那么将字段从模型“复制/粘贴”到表单中是非常多余的。编辑模型时需要加倍努力。为什么
    save(commit=False)
    ?不应将其设置为“真”Thanx进行更正。它应该是
    commit=True
    。更新即使传递了
    commit=False
    ,看到模型被保存也可能会让人困惑。如果使用
    commit=False
    调用save()方法,可能会引发异常,因此很明显它不受支持(因为我看不到支持它的正确方法)。