2016-07-12 85 views
0

我是django的新手,我想用另一个类来扩展用户模型。但是,我不确定如何让表单与类设备正常工作。我想要温度,并在表格中显示电池。谢谢提前:)在视图中呈现django窗体

models.py非常

class Device(models.Model): 
    temperature = models.IntegerField() 
    battery = models.IntegerField() 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    deviceNb= models.CharField(max_length=50) 
    device = models.OneToOneField(Device, null=True) 

User.profile = property(lambda u : UserProfile.objects.get_or_create(user=u)[0]) 

forms.py

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('deviceNb', 'device',) 

views.py

def user_profile(request): 
    if request.method == 'POST':    
     form = UserProfileForm(request.POST, instance=request.user.profile) 


     if form.is_valid: 
      form.save() 
      #to go back to check that the info has changed 
      return HttpResponseRedirect('/accounts/loggedin') 

    else: # when this is a get request 
     user = request.user 
     profile = user.profile 
     form = UserProfileForm(instance=profile) 

    args = {} 
    args.update(csrf(request)) 
    args['form'] = form 

    return render(request, 'profile.html', args) 
+0

内联窗体集是答案。从文档:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets – ivan7707

+1

注意它应该'如果form.is_valid()'。如果你忘记括号并写入'if form.is_valid',那么'form.is_valid'将总是*评估为True。 – Alasdair

+0

感谢您的提示!确实会做出改变。 :) – Rose

回答

1

UserProfile形式取出device场 - 您要编辑现有设备,而不是将其更改为其他设备副。

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('deviceNb',) 

然后创建设备表单。

class DeviceForm(forms.ModelForm): 
    class Meta: 
     model = Device 
     fields = ('temperature', 'battery',) 

然后更新您的视图来处理两种形式。例如,您需要实例化两个表单,检查两个表单是否有效,如果两个表单都有效,则保存这些表单等。如果device不存在,您可以使用commit=False保存配置文件表单以获取profile,设置设备,然后最终保存配置文件。

def user_profile(request): 
    user = request.user 
    profile = user.profile 
    device = profile.device 
    if request.method == 'POST':    
     form = UserProfileForm(request.POST, instance=profile) 
     device_form = DeviceForm(request.POST, instance=device) 

     if form.is_valid() and device_form.is_valid(): 
      device = device_form.save() 
      profile = form.save(commit=False) 
      profile.device = device 
      profile.save() 
      #to go back to check that the info has changed 
      return HttpResponseRedirect('/accounts/loggedin') 

    else: # when this is a get request 
     form = UserProfileForm(instance=profile) 
     device_form = DeviceForm(instance=device) 

    args = {} 
    # Delete the following line - you don't need it now that you use render 
    # args.update(csrf(request)) 
    args['form'] = form 
    args['device_form'] = device_form 

    return render(request, 'profile.html', args) 

最后,在您的模板中,在同一个<form>标记中包含两个表单。

<form method='post'> 
    {{ form }} 
    {{ device_form }} 
    <input type="submit" value="submit" /> 
</form> 
+0

:)非常感谢你!它工作完美。 – Rose