在formset.save()上的formset上设置外键

时间:2010-07-07 16:28:12

标签: django django-models django-forms

这很简单 - 如果问题得到解答,我想要做的就是回答问题。如果问题得到解答,有人可以告诉我如何设置表单值。我知道我也可以将其设置为初始值,但我必须有选择地确定哪些记录得到了回答。这看起来更简单,但是我把头发拉出来试图解决这个问题。有人可以帮我吗。

模型很简单

class ProjectQuestion(models.Model):
    question = models.CharField(max_length=255, editable=True)
    answer_type = models.CharField(max_length=50, choices=VALUE_TYPE_CHOICES, editable=True)
    answer = models.CharField(max_length=255, null=True, blank=True)
    answer_comment = models.TextField(blank = True, null = True)
    answered_by = models.ForeignKey(Employee, related_name="answered_by_test", null=True, blank=True)
    answer_date = models.DateTimeField(auto_now = True, null=True)
    objects = models.Manager()


    def __unicode__(self):
        return u'%s' % (self.question)

表示视图也很简单。

# views.py
if request.method == "POST":
    print request.POST
    print request.user
    formset = QuestionFormSet(data=request.POST, files=request.FILES,
                              queryset=ProjectQuestion.objects.filter(id__lt=shortname))
    print formset.forms
    if formset.is_valid():
        person =  Employee.objects.get(name__iexact = request.user.get_full_name())
        for i in range(0, formset.total_form_count()):
            form = formset.forms[i]
            if form.cleaned_data['answer']:
                # THIS DOESN'T WORK...  PLEASE FIX..
                form.save(commit=False)
                form.answered_by = person
                form.save()
else:
    active_section = ProjectQuestion.objects.filter(id__lt=shortname)

2 个答案:

答案 0 :(得分:6)

不应该是

if form.cleaned_data['answer']:
    # THIS DOESN'T WORK...  PLEASE FIX..
    question = form.save(commit=False)
    question.answered_by = person
    question.save()

答案 1 :(得分:4)

Ashok有正确的答案 - form.save返回实例对象,保存与否,具体取决于commit的值。

作为附带问题,请注意:

    for i in range(0, formset.total_form_count()):
        form = formset.forms[i]

很多更好地写成:

    for form in formset.forms:

如果由于某种原因你确实需要索引变量,那么这仍然更好:

    for i, form in enumerate(formset.forms):