2016-02-29 75 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