O formulário de gerenciamento do Django está falhando porque 'form-TOTAL_FORMS' e 'form-INITIAL_FORMS' não estão preenchidos corretamente
Eu gostaria de criar formulários aninhados como é melhor descrito através do exemplo fornecido em:
http://yergler.net/blog/2009/09/27/nested-formsets-with-django/
O tutorial nesta página parece ser muito bom e está tentando realizar o problema exato que estou encontrando.
Parece haver um problema com essa implementação no arquivo views.py quando não há dados de solicitação POST (ou seja, estamos realizando o preenchimento inicial do banco de dados).
O código pode ser visto na URL fornecida acima (se necessário eu posso postar um pouco do código, mas temo que isso tire as informações fornecidas aqui).
Aqui está o código views.py que está falhando (em negrito):
block = get_object_or_404(models.Block, id=block_id)
if request.method == 'POST':
formset = forms.BuildingFormset(request.POST, instance=block)
if formset.is_valid():
rooms = formset.save_all()
return redirect('block_view', block_id=block.id)
else:
formset = forms.BuildingFormset(instance=block) #This is the line that is throwing the ValidationError
A mensagem de erro que estou recebendo é:
ValidationError at "urlName":
[u'ManagementForm data is missing or has been tampered with']
Eu tenho cavado mais fundo e parece que esta falha está ocorrendo na linha site-packages / django / forms / formsets.py
ois_valid()
a verificação está falhando porque alguns dos dados obrigatórios do formulário de gerenciamento (formulário-TOTAL_FORMS, form-INITIAL_FORMS e form-MAX_NUM_FORMS) são inválidos. Aqui está a saída real de self.errors abaixo:
{u'TOTAL_FORMS': [u'This field is required.'], u'INITIAL_FORMS': [u'This field is required.']}
Código:edit_building.html:
{{buildings.management_form}}
{% para a construção em buildings.forms%}
{{ building }}
{% if building.nested %}
{% for formset in building.nested %}
{{ formset.as_table }}
{% endfor %}
{% endif %}
{% endfor%}
views.py:
def should_delete(self, form):
"""Convenience method for determining if the form’s object will
be deleted; cribbed from BaseModelFormSet.save_existing_objects."""
if self.can_delete:
raw_delete_value = form._raw_value(DELETION_FIELD_NAME)
should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value)
return should_delete
return False
def save_all(self, commit=True):
"""Save all formsets and along with their nested formsets."""
# Save without committing (so self.saved_forms is populated)
# — We need self.saved_forms so we can go back and access
# the nested formsets
objects = self.save(commit=False)
# Save each instance if commit=True
if commit:
for o in objects:
o.save()
# save many to many fields if needed
if not commit:
self.save_m2m()
# save the nested formsets
for form in set(self.initial_forms + self.saved_forms):
if self.should_delete(form): continue
for nested in form.nested:
nested.save(commit=commit)
forms.py:
def should_delete(self, form):
"""Convenience method for determining if the form’s object will
be deleted; cribbed from BaseModelFormSet.save_existing_objects."""
if self.can_delete:
raw_delete_value = form._raw_value(DELETION_FIELD_NAME)
should_delete = form.fields[DELETION_FIELD_NAME].clean(raw_delete_value)
return should_delete
return False
def save_all(self, commit=True):
"""Save all formsets and along with their nested formsets."""
# Save without committing (so self.saved_forms is populated)
# — We need self.saved_forms so we can go back and access
# the nested formsets
objects = self.save(commit=False)
# Save each instance if commit=True
if commit:
for o in objects:
o.save()
# save many to many fields if needed
if not commit:
self.save_m2m()
# save the nested formsets
for form in set(self.initial_forms + self.saved_forms):
if self.should_delete(form): continue
for nested in form.nested:
nested.save(commit=commit)
Notas:Eu já examinei a documentação do django emhttps://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform e não encontrou nada muito útil que discuta como esses valores são automaticamente preenchidos pelo DJANGO
Eu estou usando o Django V1.5
Questões:No caso de não haver dados POST e o formulário estar sendo gerado apenas a partir do banco de dados, como os dados 'form-TOTAL_FORMS' e 'form-INITIAL_FORMS' devem ser preenchidos corretamente para solucionar essa falha?