2013-03-01 2 views
4

Я пытаюсь отобразить форму и набор форм сразу. Формат работает нормально (я думаю), но форма не проверяется (как если бы не было данных)Как отправить форму и форму в то же время

формы все работают независимо друг от друга, но не тогда, когда представленный togetehr так кажется, что проблема в взглядах здесь код:

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

Это представит форму и набор форм одновременно.

//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

perfect! .. я немного подделал, но отлично ... спасибо – rafirosenberg

1

Вам нужно только один форма тега. Если вы ожидаете получить все данные одновременно, вам необходимо обернуть все поля одним тегом формы.

+0

Я просто пробовал это, но он все еще не работал ... подход в следующем ответе казался ... но спасибо – rafirosenberg

+0

Вам все еще не нужны два отдельных тега

. Это совершенно необязательно. Не публикуя свои модели, невозможно сказать, есть ли у вас правильная кодировка в вашей форме. Если это проблема, вы должны пересмотреть свой вопрос, чтобы быть более точным. Если вы заметили, в ответе, который вы приняли, используется только один тег формы. – Brandon

+0

спасибо ... вы правы и я исправил это, ... но этого было недостаточно, я думаю, что основная проблема заключалась в том, что я не включал .. enctype = "multipart/form-data" – rafirosenberg

Смежные вопросы