【问题标题】:Django inline formset setupDjango 内联表单集设置
【发布时间】:2011-10-04 13:06:26
【问题描述】:

我的课程设置如下:

class InspectionGroup(models.Model):
   group = models.CharField(max_length=50)

class InspectionItem(models.Model):
   group = models.ForeignKey(InspectionGroup)
   item = models.CharField(max_length=50)

class InspectionQuestion(models.Model):
   item = models.ForeignKey(InspectionItem)
   question = models.CharField(max_length=200)
   question_pass = models.BooleanField()

class InspectionResult(models.Model):
   question = models.ForeignKey(InspectionQuestion)
   vehicle = models.ForeignKey(Vehicle)
   result = models.BooleanField()
   submitted_by = models.ForeignKey(User, editable=False)
   date_time_submitted = models.DateTimeField(default=datetime.today,
                            editable=False)

我想做的是让用户选择一个检查组,然后从该组中,他们将看到该组下的所有问题,其项目标题用于模板中的分组。然后他们会回答问题并发布结果。

我的问题是完成这项工作。我已经开始编写一些代码,但它似乎并不正确。

forms.py
QuestionFormSet = inlineformset_factory(InspectionItem, InspectionQuestion, 
            form=QuestionForm, extra=0, can_delete=False)
class BaseInspectionFormset(BaseInlineFormSet):
    def add_fields(self, form, index):
        # allow the super class to create the fields as usual
        super(BaseInspectionFormset, self).add_fields(form, index)

        # created the nested formset
        try:
            instance = self.get_queryset()[index]
            pk_value = instance.pk
        except IndexError:
            instance=None
        pk_value = hash(form.prefix)

        # store the formset in the .nested property
        form.nested = [QuestionFormSet (instance = instance, 
                        prefix = 'INSPECTIONQUESTIONS_%s' % pk_value)]
InspectionFormset = inlineformset_factory(InspectionGroup, InspectionItem, 
          formset=BaseInspectionFormset, extra=0, can_delete=False)


view.py
def vehicle_inspection(request, stock_number, id):
vehicle = get_object_or_404(Vehicle, stock_number=stock_number)
group = get_object_or_404(InspectionGroup, pk=id)

if request.method == 'POST':
    formset = InspectionFormset(request.POST, instance=group)

    if formset.is_valid():
        results = formset.save_all()

        return HttpResponseRedirect(reverse('inspectionRecord', 
                  kwargs={'stock_number': stock_number}))
else:
    formset = InspectionFormset(instance=group)


return render_to_response('vehicles-inspection-form.html', {
       'formset': formset})

有人可以确认这个想法是否可行,或者我需要做什么才能拥有我想要的功能?目前我收到此错误:

[u'ManagementForm data is missing or has been tampered with']

更新 1 我已经通过点击此链接from readthedocs

解决了上述错误

然而,目前看来,表单集似乎是空的,因为模板只显示了提交按钮。

<form action="." method="POST" id="inspection_form">
    {% csrf_token %}
    <div id="form">
        {{ formset.management_form }}
        {% for form in formset.forms %}
            {{ form }}
            {% if form.nested %}
                {% for formset in form.nested %}
                    {{ formset.as_table }}
                {% endfor %}
            {% endif %}
         {% endfor %}
     </div>
     <div class="form_buttons">
         <button type="submit" name="confirm" id="confirm">
             <span>Submit</span>
         </button>
     </div>
 </form>

现在可能是什么问题?

【问题讨论】:

    标签: django inline-formset


    【解决方案1】:

    文档似乎有答案:https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform

    编辑:for form in formset 而不是 formset.forms

    {{ form.as_table }} 而不是{{ form }}

    【讨论】:

    • 上面的链接确实没有从第一个错误指向手头的问题。这个link 做到了
    • 我认为 formset 的想法不适合我...您认为代码正确吗?即使在建议的更改之后,表格仍然是空白的。如果您知道 formset 方法的替代方法存在,那也很棒
    • 看起来 inline_formset 是您想要编辑模型关系时所需要的。如果您在模板中仅使用 {{ formset }},它会输出任何内容吗?
    • 我同意 inline_formset ......这很奇怪,即使只使用 {{ formset }} 它也没有显示任何内容
    • 它与您的表单集中的 extra=0 参数有关。
    猜你喜欢
    • 2019-05-15
    • 2011-07-11
    • 2016-03-15
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2015-10-01
    • 2012-03-20
    相关资源
    最近更新 更多