2014-10-29 2 views
0

Так что я пытаюсь понять здесь, как создать форму для каждого из этих элементов, чтобы ее можно было добавить, чтобы добавить примечание к этому одному ученику. Если эта заметка не была заполнена, тогда она получит уведомление об ошибке только для одной заметки. Это просто быстрый пример, который я собрал, чтобы попытаться получить от этого информацию. Я не уверен, какой набор форм мне нужен здесь, который позволит мне отображать всю информацию об объекте экзамена, имея форму там тоже.несколько одинаковых форм на странице

Редактировать: возможно, возможно, у меня есть решение. Я делаю

examscores = Exam.objects.all() 
NoteFormset = formset_factory(NoteForm, extra = len(examscores)) 
notesets = NoteFormset() 
examscores_and_forms = zip(examscores, notesets.forms) 

Затем в шаблоне я делаю {% для экзамена, формы в examscores_and_forms%} это, кажется, приносит определенные результаты. Мне просто нужно скрыть идентификатор объекта и get_object_or_404, если форма действительна и изменена. Я продолжу позднее это обновление с полным решением.

views.py

def studentscores(request): 
    examscores = Exam.objects.all() 

    if request.POST: 
     form = NoteForm(request.POST) 

     if form.is_valid(): 
      pass 
      return HttpResponseRedirect(request.get_full_path()) 
     else: 
      return render_to_response('exams.html', { 'examscores': examscores, 'form': form }, context_instance=RequestContext(request)) 
    else: 
     form = NoteForm() 
     return render_to_response('exams.html', { 'examscores': examscores, 'form': form }, context_instance=RequestContext(request)) 

models.py

class Student(models.Model): 
    firstname = models.CharField(max_length=100) 
    lastname = models.CharField(max_length=100, blank=True, null=True) 

    def __unicode__(self): 
     if self.firstname and self.lastname: 
      fullname = self.firstname + " " + self.lastname 
      return fullname 
     else: 
      return self.firstname 


class Note(models.Model): 
    student = models.ForeignKey(Student) 
    note = models.TextField() 

    def __unicode__(self): 
     return str(self.student) 


class Exam(models.Model): 
    student = models.ForeignKey(Student) 
    score = models.IntegerField() 

    def __unicode__(self): 
     return str(self.student) + " " + str(self.score) 

forms.py

class NoteForm(forms.Form): 
    note = forms.CharField(required=True) 

шаблон

{% for exam in examscores %} 
<form action="" method="post">{% csrf_token %} 
<table> 
    <tr> 
     <td>{{ exam.student }}</td> 
     <td>{{ exam.score }}</td> 
    </tr> 
    <tr> 
     <td>{{ form.as_p }}</td> 
     <td><button type="submit" name="action" value="addnote" />Note</button></td> 
    </tr> 
</table> 
</form> 
{% endfor %} 

ответ

0

Попробуйте inlineformset_factory вы можете справиться с многими из них, на ваш взгляд. Ниже я описал некоторые важные шаги, которые можно использовать для динамического создания форм (обработка их - это обработка одного объекта формы в вашем представлении, и это просто, как одна форма):

1) визуализируйте свой набор форм на свой шаблон, посмотрите на визуализированную структуру html, создайте пустой шаблон формы <script type="text/html" id="formset-item-template">__item-widget__</script> и, возможно, разделите его на скелет и виджеты <script type="text/html" id="image-item-widget"></script>.

2) Загрузите этот шаблон в блок сценариев другого (основного для этого вида) шаблона. Предоставьте некоторую функцию js для обработки добавленной формы.

3) Получите ваши скелеты var tempItemWidgetMarkup = $('#select-item-widget').html(); и скомпилировать их установки нового id и name и еще чего-л вам нужно с помощью replace:

itemWidgetMarkup = tempItemWidgetMarkup.replace(/__options-set__/g, tempStr);.

4) Приращение суммарного значения форм $(this).siblings('fieldset').find('div input[name$="TOTAL_FORMS"]').val(itemsCount + 1); также проверяет значение и приращение MAX_NUM_FORMS, если у вас более 1000 форм.

5) Когда "компилирование" делается - добавьте его в FIELDSET $(compiledTemplateMarkup).hide().appendTo($(this).siblings('fieldset')).fadeIn(1000);

Попробовать и, если я пропустил (л каждый раз делать) - спросите :)

Update:

То есть, как вы должны установить начальные данные для formset:

examscores = Exam.objects.values() # returns dictionary 
NoteFormset = formset_factory(NoteForm, extra=0) # or change extra to how many empty forms you want 
formset = NoteFormset(initial=examscores) 
+0

Я только что вернулся, чтобы посмотреть, есть ли какие-либо комментарии по этому поводу. Я на самом деле сейчас смотрел inlineformset_factory. Попытка выяснить, как я могу связать отображение объекта, который разделяет FK с формой, которую я представляю. Мне, возможно, придется изменить мой вышеупомянутый вопрос, чтобы проиллюстрировать это. Спасибо, что вернулись. – bDreadz

+0

Посмотрите на 'form_valid' здесь http://stackoverflow.com/a/26591411/3033586 – madzohan

+0

' как я могу связать отображение объекта, который имеет FK, с формой, которую я представляю, если вы создаете этот объект, и есть другие поля, кроме FK, тогда 'form' из примера должен быть экземпляром вашего класса' object' ModelForm – madzohan