2013-03-01 3 views
4

양식과 formset을 한 번에 렌더링하려고합니다. formset이 잘 작동하고 있지만 양식이 유효하지 않습니다 (데이터가 게시되지 않은 것처럼)양식과 formset을 동시에 제출하는 방법

버튼을 사용하여 게임을 시도했지만 기본 제출 기능은 js를 통해 제공됩니다. 당신은 하나의 필요

views.py 

from django.shortcuts import render, render_to_response 
from django.http import HttpResponseRedirect 
from forms import LessonForm, AddMaterialForm 
from models import Lesson, SUBJECT_OPTIONS, Materials, MATERIAL_TYPES 
from django.forms.formsets import formset_factory 

def Create_Lesson(request): 
    AddMaterials=formset_factory(AddMaterialForm, extra=9) 
    if request.method == "POST": # If the form has been submitted... 
     lesson = LessonForm(request.POST, prefix="lesson") # A form bound to the POST data 
     formset = AddMaterials(request.POST, request.FILES) # A form bound to the POST data 
     if lesson.is_valid() and formset.is_valid(): # All validation rules pass 
      lesson = lesson.save(commit=False) 
      lesson.creator = request.user 
      lesson.save() 
      for form in formset: 
       form = form.save(commit=False) 
       form.lesson = lesson.pk 
       form.save() 
      return render(request, 'index.html',) 
    else: 
     lesson= LessonForm(prefix='lesson') # An unbound form 
     formset = AddMaterials() 
    return render(request, 'create_lesson/create.html', { 
    'form': lesson,'formset':formset 
}) 

.html 중에서

<form id="create_lesson_form" method="post" action=""> 
    <h2>1: Create Your Lesson</h2> 

     {{ form.non_field_errors }} 
     <label for="subject"><span>Subject</span></label> 
     {{form.subject}} 
     {{ form.subject.errors }} 
     <label for="title"><span>Title</span></label> 
     <input type="text" id="title" name="name" placeholder="Give it a name"/> 
     {{ form.name.errors }} 
     <label class="error" for="title" id="title_error">You must choose a title!</label>    
     <label for="subtitle"><span>Subtitle</span></label> 
     <input type="text" id="subtitle" name="subtitle" placeholder="Type your subtitle here"/> 
     {{ form.subtitle.errors }} 
     <label class="error" for="subtitle" id="subtitle_error">are you sure you want to leave subtititle blank?</label> 
     <label for="description"><span>Description</span></label> 
     <textarea id="description" name= "description" cols="42" rows="5" placeholder="why is it important? this can be a longer description"'></textarea> 
     {{ form.description.errors }} 
     <label class="error" for="description" id="description_error">are you sure you want to leave the description blank?</label> 
     <label for="success" id="Goals_title"><span>Goals</span></label> 
     <textarea id="success" name="success" cols="42" rows="5" placeholder="explain what sucess might look like for someone doing this lesson...what does mastery look like?" '></textarea> 
     {{ form.success.errors }} 
     <label class="error" for="success" id="success_error">are you sure you want to leave the goals blank?</label> 
    {{ form.directions.errors }} 
     <label class="error" for="directions" id="directions_error">are you sure you do not want to include dierections?</label> 
    <label for="directions" id="Directions_title"><span>Directions</span></label> 
     <textarea id="directions" name="directions" cols="42" rows="5" placeholder="you can add simple directions here" '></textarea><br> 
    </form> 


    <form id="add_elements_form" method="post" action=""> 
    {% csrf_token %} 
    {{ formset.as_p}} 
    <button type='submit' id='finish'>Finish Editing Lesson</button> 
    </form> 

답변

5

이렇게하면 양식과 formset이 동시에 제출됩니다.

//When your uploading files or images don't forget to put "multipart/form-data" 
// in your form. 
//To connect formset in your form, don't forget to put the model in the formset 
// for instance. 
//In this you can add many lines as you want or delete it. 

forms.py

class LessonForm(forms.ModelForm): 
    class Meta: 
     model = Lesson 


MaterialsFormset = inlineformset_factory(Lesson, Materials, 
    fields=('field_name', 'field_name'), can_delete=True) 

views.py

def view_name(request): 
    form = LessonForm() 
    formset = MaterialsFormset(instance=Lesson()) 
    if request.method == 'POST': 
     form = LessonForm(request.POST) 
     if form.is_valid(): 
      lesson = form.save() 
      formset = MaterialsFormset(request.POST, request.FILES, 
       instance=lesson) 
      if formset.is_valid(): 
       formset.save() 
       return render(request, 'index.html',) 
    return render(request, "page.html", { 
     'form': form, 'formset': formset 
    }) 

HTML

<form method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    {{ formset.as_p }} 
    <input type="submit" value="Save"/> 
</form> 
,
+0

을 포함하지 않는다고 생각한다! .. 나는 그것을 조금 비틀었다. 훌륭했다. .. 고마워. – rafirosenberg

1

:이 문제처럼 보일 수 있도록 togetehr 제출하면 모든 작업이 독립적으로하지만 여기에 뷰 에

형태는 코드입니다 양식 태그. 모든 데이터를 동시에 수신하려면 모든 필드를 하나의 양식 태그로 묶어야합니다.

+0

방금 ​​시도했지만 여전히 작동하지 않았습니다 ... 다음 응답의 접근 방식은 ... 것으로 보였습니다. 그러나 감사합니다. – rafirosenberg

+0

두 개의 별도

태그가 필요하지 않습니다. 그것은 완전히 불필요한 것입니다. 모델을 게시하지 않으면 양식에 올바른 인코딩이 있는지 여부를 말할 수 없습니다. 그게 문제 였다면 더 정확한 질문을 수정해야합니다. 알아 차리면 받아 들인 대답은 하나의 양식 태그 만 사용합니다. – Brandon

+0

고마워 ... 너는 정확하고 그걸 고쳤다. ...하지만 충분하지 못했다. 주된 문제는 .. enctype = "multipart/form-data" – rafirosenberg