2016-07-12 10 views
0

私はdjangoが初めてで、別のクラスでユーザーモデルを拡張したいと思います。しかし、クラスDeviceで正しく動作するようにフォームを取得する方法がわかりません。私は温度と電池がその形で現れるようにします。 ビューでの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

これは 'if if form.is_valid()'であることに注意してください。括弧を忘れて 'if form.is_valid'と書くと、' form.is_valid'は*常に* Trueと評価されます。 – Alasdair

+0

チップのおかげで!本当に変化を起こすでしょう。 :) – Rose

答えて

1

UserProfileフォームからdeviceフィールドを削除します - 既存のデバイスを編集し、別のデバイスに変更しない副。

次に、デバイスフォームを作成します。

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

次に、2つのフォームを処理するようにビューを更新します。たとえば、両方のフォームをインスタンス化し、両方が有効であることを確認し、両方のフォームが有効であれば保存します。 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

関連する問題