2016-09-09 1 views
0

현재 두 개의 양식을 한 페이지에 넣으려고합니다. 클래스 기반 뷰를 사용하고 있습니다.django 클래스 기반보기 다중 양식 유효성 검사

class TaskDetailView(FormMixin, generic.DetailView): 
    model = Task 
    template_name="tasks/detail.html" 
    form_class = NoteForm 
    form_class2 = DurationForm 

    def get_context_data(self, **kwargs): 
     context = super(TaskDetailView, self).get_context_data(**kwargs) 
     context['note_form'] = self.get_form() 
     context['notes'] = Note.objects.filter(task__slug=self.kwargs['slug']) 
     context['duration_form'] = self.form_class2() 
     context['duration'] = Duration.objects.all() 
     return context 

    def get_success_url(self): 
     return reverse('task_detail', kwargs={'slug': self.kwargs['slug']}) 

    def post(self, request, *args, **kwargs): 
     if not request.user.is_authenticated: 
      return HttpResponseForbidden 
     self.object = self.get_object() 
     form = self.get_form() 
     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def form_valid(self, form): 
     current_task = get_object_or_404(Task, slug=self.kwargs['slug']) 
     self.object = form.save(commit=False) 
     self.object.task = current_task 
     self.object.save() 
     return HttpResponse(self.get_success_url()) 

현재 상태는 모든 양식을 표시하고 메모 양식 만 저장할 수 있다는 것입니다. 200 개의 상태 POST가 있지만 데이터가 데이터베이스에 저장되지 않아도 지속 시간 형식을 저장할 수 없습니다.

내 실수는 내가 유효성을 검사하지 않는다는 것이지만 실제로 어떻게 해야할지 잘 모르겠다. 장고의 CBV에서 여러 양식에 대한 정보가별로 없다.

나는 약간의 지침과 도움에 정말로 감사 할 것입니다.

감사

+0

경로를 혼란스럽게 만들기 때문에 디자인을 다시 생각해보십시오. 우선 브라우저는 두 양식 중 * ONE * 만 보냅니다. HTML은 두 개의 submit 버튼이있는 하나의 폼이 오류가 발생하기 쉽고 Django의 form 클래스 디자인에 반하는 두 개의 폼을 보여주기 위해 템플릿을 중첩하거나 조정할 수 없습니다. 즉, 런타임에 사용할 양식을 선택하고 완벽한 방법이 필요합니다. [get_form_class] (https://docs.djangoproject.com/en/1.10/ref/class-based-views/mixins- 편집/# django.views.generic.edit.FormMixin.get_form_class). 그러나 가장 쉬운 방법은 2 개의 서로 다른 URL을 사용하는 것입니다. – Melvyn

+0

안녕 Melvyn, 그래서이 장고 - 특정 문제는 단일 페이지에 여러 개의 양식이 정말 적합하지 않습니다? –

+0

안녕하세요. 예, 아니오. 브라우저는 한 번에 하나의 양식 만 보냅니다. 이러한 관점에서 볼 때 여러 폼을 처리하기 위해 페이지 또는 뷰 객체를 디자인하는 것은 거의 의미가 없습니다. 특히 두 개의 다른 URL에서 두 양식을 처리하는 것이 매우 쉽기 때문에 특히 그렇습니다. 다른 ModelForm Basket에 대한 외래 키를 처리하는 ModelForm for Apples가있는 경우 formets를 사용해야하며 Basket 양식 만보기로 등록해야합니다. 그러나 귀하의 질문에 나는이 두 형태가 관련이 없지만 두 가지 다른 일을 성취하고 있음을 이해합니다. – Melvyn

답변

0

귀하의 post 방법은 두 번째 양식 아무것도하지 않습니다. 첫 번째 인스턴스를 수행 할 때 인스턴스를 생성하고 유효성을 검사해야합니다. 한 페이지에 여러 형태를 갖는

+0

안녕하세요, 어떻게 할 수 있는지 잘 모르겠습니다. 내가 읽을 수있는 URL이 있습니까? 내 현재 코드는 모두 서로 다른 tuts에서 왔습니다. –

+0

원하는 URL이 확실하지 않습니다. 첫 번째 양식을 인스턴스화하고 유효한지 확인하십시오. 이제 두 번째 양식과 동일하게 처리해야합니다. –

0

아주 간단한 방법처럼, 당신의 POST 조치를 구분하는 몇 가지 숨겨진 매개 변수를 정의하는 것입니다 : 당신의 CBV 포스트 방법에

<input name="formType" type="hidden" value="note"> 

, 당신은 할 수 :

form_type = request.POST.get('formType', None) 
if form_type == 'note':