所以我在这里要弄清楚的是如何为每个项目创建一个表单,以便可以提交它以为该学生添加注释。如果没有填写那一个注释,那么它将收到一个错误通知,仅针对该一个表单注释。这只是我放在一起试图获得输入的一个简单示例。我不确定我需要什么样的表单才能让我在表格中显示所有的考试对象信息。
编辑:所以我想我有一个解决方案。 我正在做一个
examscores = Exam.objects.all()
NoteFormset = formset_factory(NoteForm, extra = len(examscores))
notesets = NoteFormset()
examscores_and_forms = zip(examscores, notesets.forms)
然后在模板中我正在做{%for exam,form in 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 :(得分:0)
尝试inlineformset_factory
您可以在视图中处理其中的许多内容。下面我已经描述了一些可以用来动态创建表单的重要步骤(处理它们是在视图中处理一个formset对象,它就像一个表单一样简单):
1)将它的formset呈现给你的模板,查看渲染的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)&#34;编译&#34;已完成 - 将其添加到您的字段集$(compiledTemplateMarkup).hide().appendTo($(this).siblings('fieldset')).fadeIn(1000);
尝试,如果我错过了smth(每次都这样做) - 请问:)
<强>更新强>:
这就是你应该如何设置初始数据到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)