2010-02-04 4 views
6

폼에 form.CheckboxSelectMultiple 위젯으로 표시되는 forms.ModelMultipleChoiceField를 사용하는 Django 앱에 ModelForm이 있습니다. 이 ModelForm은 다 대다 관계의 값을 선택/선택 취소하는 데 사용됩니다. 문제는 다음과 같습니다. 모든 확인란의 선택을 취소하고 양식을 저장하면 저장되지 않습니다. 1을 제외한 모든 항목의 선택을 취소하면 제대로 저장됩니다.Django 모델 폼 (forms.ModelMultipleChoiceField 사용)

모델 양식과 다 대다 관계에 대해 여기에서 빠뜨린 트릭이 있습니까? 버그가 발생 했습니까? 나는 장고를 처음 사용했다. 미리 감사드립니다.

사용자 정의 필드 :

class NetworkMessageChoiceField(forms.ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return obj.display_message  

모델 형태 :

def save_message_templates(request, extra_context=dict()): 
    try: 
     profile_obj = request.user.get_profile() 
    except ObjectDoesNotExist: 
     profile_obj = UserProfile(user=request.user) 

    if request.method == 'POST': 
     form = MessageTemplateForm(request.POST, instance=profile_obj) 
     if form.is_valid(): 
      form.save() 
      return redirect('/') 

    return index(request, message_template_form=form) 

편집 :

내 FO

class MessageTemplateForm(forms.ModelForm): 
    network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects, 
              widget=forms.CheckboxSelectMultiple())   
    class Meta: 
     model = UserProfile 
     fields = ('network_messages',) 

보기 양식을 저장 rm 필드가 누락되었습니다. 필수 = 거짓.

class MessageTemplateForm(forms.ModelForm): 
    network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects, 
               widget=forms.CheckboxSelectMultiple(), 
               required=False)   
    class Meta: 
     model = UserProfile 
     fields = ('network_messages',) 

답변

0

당신은 당신의 모델이 어떻게 생겼는지 붙여하지 않았다, 그래서 모델의 network_messages 필드가 필요하다는 것을 추측하고있다. 이 경우 해당 필드 값이 NULL (비어 있음) 인 양식을 제출하려고 시도하면 form.is_valid()True을 반환하지 않으므로 form.save()은 절대로 실행되지 않습니다.

대화 형 셸에서이 항목을 실행 해 보았습니다. 양식을 인스턴스화하고 수동으로 시도하려 했습니까 save()?

+0

감사합니다. 그것은 완전히 답이되었습니다. 나는 내 질문을 게시 한 후 그것을 알아 냈다. 누락되었습니다. 필수 = 폼 필드에 거짓! \t 클래스 MessageTemplateForm (forms.ModelForm) \t \t network_messages = NetworkMessageChoiceField (검색어 세트 = NetworkMessageTemplate.objects, \t \t \t \t \t \t \t \t \t \t \t \t \t 위젯 forms.CheckboxSelectMultiple =() \t \t \t \t \t \t \t \t \t \t \t \t \t 필수) = 거짓 \t \t 클래스 메타 : \t \t \t 모델 = USERPROFILE \t \t \t 필드 = ('network_messages') – Rob

+0

우수! 서비스에 기뻐. – jathanism