簡體   English   中英

Django:缺少ManagementForm數據...... Formset不會驗證。為什么?

[英]Django: ManagementForm data is missing … Formset will not validate. Why?

出於某種原因,我提交后,我的formset將無法驗證。 關於這種方式的任何想法都可能發生?

#models.py

class Department(models.Model):
  department = models.CharField(verbose_name = "Department Name", max_length=100)
  description = models.TextField(verbose_name = "Description", blank=True, null=True)
  sp_description = models.TextField(verbose_name = "Description (Spanish)", blank=True, null=True)
  phone = PhoneNumberField()
  phone_ext = models.CharField(max_length=10, blank=True)

  #Relations
  provider = models.ForeignKey(Provider, blank=True, null=True)
  services_offered = models.ManyToManyField(ServiceType)

  def __unicode__(self):
    return self.department

#view.py

def display_step5(request):
    msg = ''
    email = request.session.get('email')
    provider_obj = retrieve_provider_instance(email)
    AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
    if is_authenticated(request):
        AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
        if request.method=='POST':
            if 'add_department' in request.POST:
                cp = request.POST.copy()
                cp['department-TOTAL_FORMS'] = int(cp['department-TOTAL_FORMS'])+ 1
                new_department = AddDepartmentFormSet(cp, prefix='department', instance=provider_obj)
            elif 'submit' in request.POST:
                formset = AddDepartmentFormSet(request.POST, instance=provider_obj)
                instances = formset.save(commit=False)
                for instance in instances:
                    instance.provider = provider_obj
                    instance.save()
                return HttpResponse("Departments have been added")
        else:
            new_department = AddDepartmentFormSet(prefix='department', instance=provider_obj)

    else:
        return HttpResponseRedirect(reverse('health.register.views.display_auth'))
    return render_to_response('step5-test.html',
{'department': new_department}, context_instance=RequestContext(request))

STEP5-的test.html

<form method='post' action='{{request.path}}'>{% csrf_token %}
  <fieldset>
    <legend>Departments</legend>
      {{ department.management_form }}
      {% for form in department.forms %}
        <HR> <div><table>{{form.as_table}}</table></div>
      {% endfor %}
     <BR/> 
     <input title='Add a new department' type='submit' name='add_department' value='Add-Another-Department' />
    </fieldset>
    <BR/><BR/>
    <input title='Submit this form' type='submit' name='submit' value='Submit' />
</form>

跟進(解決方案):

Brant提供了一些有關錯誤發生原因的見解。 就我而言,他的見解幫助我構建了一個對我的情況更有效的黑客。 此hack似乎適用於可能在模板中以某種方式修改的表單集。 在我的情況下,我的formset變得復雜,需要一些ajax,使其更加用戶友好。

“retrieve_provider_instance(email)”是基於數據庫中設置的各種標准(約200行代碼嘔吐)檢索提供者對象的動態方式。

經過一番廣泛的調試后,下面的黑客為我工作了。 我通過在模板的“for”循環中添加以下隱藏字段來解決它

{% {for form in formset.forms %}
                     <tr>
                      <td>
                         {% if form.instance.pk %} <!--- if instance already exists on db --->  
                         {{ form.DELETE }}
                         <input type='hidden' name="department_set-{{ forloop.counter0 }}-id" id="id_department_set-{{ forloop.counter0 }}-id"  value={{ form.instance.pk }} />
                         {% endif %}
                      Name: <br/> {{ form.department}} <br/>
                      Phone Number: <br/> {{ form.phone }} <br/>
                      Phone Ext: <br/> {{ form.phone_ext }}</td>
                      <td>Description: <br/> {{ form.description }}</td>
                      <td>Description (Spanish): <br/> {{ form.sp_description }}</td>
                      <td>Services Provided: <br/> {{ form.services_offered }}</td>
                      <td></td>
                   </tr>
                   {% endfor %} 

我接受了馬克的答案,因為它更適用於我提出的具體問題。 希望這將有助於將來試圖實現此示例的其他用戶。 實際上,在提交時指定“前綴”是正確的方法並且最有意義。

感謝您的所有回復。

最誠摯的問候,馬特


后續行動 :我想我可能已經找到了部分問題。 但是,它還沒有解決。

以下是一些可能有助於解決問題的其他信息。 不正確的POST數據可能搞砸了嗎? 如果是這樣,我該如何解決這個問題呢?

這是我提交formset后發生的事情(在這種情況下只有一個表單):

回溯如下:

在_management_form 68中輸入文件“/home/mhjohnson/webapps/resourcedb/lib/python2.6/django/forms/formsets.py”。引發ValidationError('ManagementForm數據丟失或被篡改')

這是我的POST數據:

department-0-phone_ext -----> u'222'

department-0-id -----> u''

department-0-services_offered -----> u'2'

department-0-phone -----> u'222-222-2222'

department-INITIAL_FORMS -----> u'0'

submit -----> u'Submit'

department-MAX_NUM_FORMS -----> u''

department-0-department -----> u'Test 1'

department-0-provider -----> u''

department-TOTAL_FORMS -----> u'1'

csrfmiddlewaretoken -----> u'92a39322b16ed7e5e10dbd6c5ac64bf4'

department-0-description -----> u'Blah blah'

department-0-sp_description -----> u'....'

有任何想法嗎?

你的問題在這里:

       if request.method=='POST':
            if 'add_department' in request.POST:
                cp = request.POST.copy()
                cp['department-TOTAL_FORMS'] = int(cp['department-TOTAL_FORMS'])+ 1
                new_department = AddDepartmentFormSet(cp, prefix='department', instance=provider_obj)
            elif 'submit' in request.POST:
                formset = AddDepartmentFormSet(request.POST, instance=provider_obj)
                instances = formset.save(commit=False)
                for instance in instances:
                    instance.provider = provider_obj
                    instance.save()
                return HttpResponse("Departments have been added")
        else:
            new_department = AddDepartmentFormSet(prefix='department', instance=provider_obj)

如果沒有POST,則傳遞前綴“department”。 如果'add_department'在POST中,則傳遞'department'的前綴。 但是,當'提交'在POST中時,您不會傳遞前綴。 沒有前綴,formset無法在POST中找到正確的數據。

有兩件事情跳出來......

首先,你不應該做這個部分:

for instance in instances:
   instance.provider = provider_obj
   instance.save()

當你這樣做時,這是照顧:

formset = AddDepartmentFormSet(request.POST, instance=provider_obj)

其次,您的代碼位於頂部:

provider_obj = retrieve_provider_instance(email)

可能無法正常工作。 在您提供的追溯中,它看起來不像提供商到達那里......

department-0-provider -----> u''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM