2016-07-12 2 views
0

저는 django를 처음 사용하기 때문에 다른 클래스로 사용자 모델을 확장하려고합니다. 그러나, 클래스 Device와 함께 제대로 작동하는 양식을 얻는 방법을 모르겠습니다. 온도와 배터리가 형태로 나타나기를 바랍니다.보기에서 django 폼을 렌더링

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'는 * 항상 *로 평가됩니다. 팁을 주신 덕분에 – Alasdair

+0

! 참으로 변화를 일으킬 것입니다. :) – Rose

답변

1

UserProfile 형태에서 device 필드를 제거 사전 :

models.py에 대단히 감사합니다 - 기존 장치를 편집하고 다른 장치로 변경하지 않으려 고합니다. 바이스.

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

관련 문제