2015-12-18 74 views
2

我有2個型號通過OneToOneField鏈接:Django的:的ModelForm與OneToOneField

class User(models.Model): 
    name = models.CharField(max_length=100, unique=True) 
    email = models.EmailField(blank=True) 
    base = models.OneToOneField(BaseUser) 
    ... 

class BaseUser(models.Model): 
    enabled = models.BooleanFiled(default=True) 
    ... 

我使用的ModelForm來顯示用戶的屬性:

class UserForm(ModelForm): 
    class Meta: 
     model = User 
     fields = ['name', 'email', ...] 

在我的觀點:

class UserCreate(generic.CreateView): 
    model = User 
    template_name = 'user/create.html' 
    success_url = reverse_lazy('users:list') 
    form_class = UserForm 

我想更改啓用在致敬用戶的模板,但我只能訪問User的字段(名稱,電子郵件...)。

我該怎麼做纔好?

回答

3

如果你只有你想添加一個附加字段,你可以把它添加到UserForm

class UserForm(ModelForm): 

    enabled = forms.BooleanField(default=True) 

    class Meta: 
     model = User 
     fields = ['name', 'email', ...] 

然後,在你form_valid方法,你可以設置base_user值。由於它是一個創建視圖,我假設你必須先創建它。

class UserCreate(generic.CreateView): 

    def form_valid(self, form): 
     base_user = BaseUser.objects.create(
      enabled=form.cleaned_data['enabled'] 
     ) 
     form.instance.base = base_user 
     return super(UserCreate, self).form_valid(form) 

如果你想添加一個以上的額外字段,那麼你可能想爲BaseUserUser獨立的形式。在這種情況下,擴展CreateView會變得有點棘手,並且使用像Rohit的答案中的基於函數的視圖可能會更簡單。

+0

'enabled'屬性給了我''BooleanField'對象沒有'model'屬性。是不是'啓用= form.BooleanField(必需= False)'? – ncrocfer

+0

良好的捕獲,這是一種形式,所以你當然想'forms.BooleanField'。 – Alasdair

5

你可以在你的模板呈現2種形式:

def user_create(request): 
    if request.method == "POST": 
     user_form = UserForm(data=request.POST) 
     baseuser_form = BaseUserForm(data=request.POST) 
     if user_form.is_valid() and baseuser_form.is_valid(): 
      base_user = baseuser_form.save() 
      user = user_form.save(commit=False) 
      user.base = base_user 
      user.save() 
      return redirect(reverse_lazy('users:list')) 
     else: 
      .... 
    else: 
     user_form = UserForm() 
     baseuser_form = BaseUserForm() 
     return render_to_response('user/create.html', {'user_form': user_form, 'baseuser_form': baseuser_form}) 
+0

由於我只有1個字段添加,我想保留我的CBV視圖。所以Alasdair的解決方案適用於我。如果以後我想添加多個字段,我將使用您的解決方案,謝謝。 – ncrocfer