2011-10-04 135 views
1

我設置我的班如下:Django的內聯表單集設置

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

但是要解決上述錯誤,現在目前,似乎該formset是空的,因爲該模板只顯示提交按鈕。

<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> 

什麼可現在的問題?

回答

1

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

編輯:for form in formset,而不是formset.forms

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

+0

上面的鏈接真的沒有指出第一個錯誤的問題。此[鏈接](http://readthedocs.org/docs/django/en/latest/releases/1.3.html#formset-updates)雖然 –

+0

謝謝。我已經更新了我的答案。 – akonsu

+0

我認爲formset的想法並不適合我...在您看來,代碼是否正確?即使在建議的更改之後,表單仍然是空白的。如果您知道存在formset方法的替代方案,那也會很棒 –