2015-12-18 72 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