2014-10-29 63 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%%,持續考試,形式}做 這似乎產生了一定的成效。我只需要隱藏對象的id和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你可以處理許多人在您的視圖。下面我描述了一些可用於動態創建表單的重要步驟(處理它們是處理視圖中的一個formset對象,並且它像一個表單一樣簡單):

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();並編譯它們設置新idname和其他不便需要使用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)當 「編譯」 做 - 把它添加到您的字段集$(compiledTemplateMarkup).hide().appendTo($(this).siblings('fieldset')).fadeIn(1000);

嘗試,如果我錯過了水木清華(每次做) - 問:)

更新

這是你應該怎麼設置初始數據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 2014-10-29 23:37:11

+0

看看這裏的'form_valid' http://stackoverflow.com/a/26591411/3033586 – madzohan 2014-10-29 23:47:17

+0

'如果你創建了這個對象,我怎麼可以配合顯示與我提交的表單共享一個FK的對象'另外一個字段除了FK,還有'form'來自example應該是你的'object'類的實例ModelForm – madzohan 2014-10-29 23:50:13

相關問題