2016-02-29 43 views
2

我已经扩展了我的用户模型并添加了一些额外的字段。我希望能够通过网络界面(而不是管理页面)添加新用户,因此需要某种形式。我如何在数据库中创建这个新用户以及表单的外观如何?表单(扩展)用户

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') 

回答

2

既然你有两个模型s,你需要两种形式。

auth.Useryourapp.MyUser的一种形式。

在你看来,你会:

  1. 实例化两种形式
  2. 检查两种形式都有效
  3. 保存用户的形式
  4. 保存MYUSER形式,使用user.pk

这应该给那样的东西

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 ... 

为了保持一致性,表单保存也应包含在交易中。但那是另一个话题。

1

你可以做到这一点像这样

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() 
+0

'get_or_create()'返回'tuple',你不能'save()''tuple'对象。 –

+0

如果您的扩展用户只有一个或两个额外字段,此解决方案非常简单。然而,如果你有更多的东西,从你的模型复制/粘贴字段到表单是相当多余的。编辑模型时需要双重工作。 –

+0

为什么'save(commit = False)'?如果它不被设置为'真' – FeedTheWeb