Estoy tratando de crear una forma dinámica, con un número variable de CharFields. Quiero poder mostrarlos a voluntad en lugares semi-arbitrarios en mi formulario. Mi enfoque fue crear una función iterable que presentara los self.fields[INDEX] correctos. Sin embargo, cuando hago esto, literalmente veo esto:
<django.forms.fields.CharField object at 0x80bae6be0> <django.forms.fields.CharField object at 0x80bae6f98> <django.forms.fields.CharField object at 0x80bae6da0>¿Cómo hago un render CharField() como se esperaba?
Mi código está a continuación:
class ImplementationForm(forms.ModelForm): """ Specifies the implementation of a given control. """ class Meta: model = Implementation fields = ['implemented', 'scope', 'separate'] def __init__(self, *args, **kwargs): control = kwargs.pop('control') super(ImplementationForm, self).__init__(*args, **kwargs) self.fields['separate'].widget.attrs.update({'class': 'separate'}) self.fields['scope'].widget.attrs.update({'class': 'scope'}) for substatement in control.substatement.all(): self.fields['statement_%s'%substatement.pk] = forms.CharField() def subfield(self): print("Comes herE") for index in self.fields: if index[:10] == 'statement_': yield self.fields[index]La plantilla básicamente hace esto:
{% for x in myform.subfield %} {{ x }} {% endfor %}Lo que está buscando son los BoundFields del formulario. por ejemplo, {{ form.email }} Está iterando sobre las instancias de campo (no las instancias de BoundField del formulario que envuelven las instancias de campo), por ejemplo, {{ form.field.email }}. Esta es la razón por la que está recibiendo la
<django.forms.fields.CharField object at 0x80bae6da0>
resultado de su plantilla. Ver: https://stackoverflow.com/a/671305/3035260
Consulte también la documentación de Django: https://docs.djangoproject.com/en/1.10/ref/forms/api/#django.forms.BoundField
Pruebe de esta manera sucia ( consulte mi edición a continuación para obtener una solución mucho mejor ):
{# Iterate over your list of field instances #} {% for x in myform.subfield %} {# Find the matching BoundField instance #} {% for field in myform %} {% if field.field == x %} {# Matching BoudField instance found, display it. #} {{ field }} {% endif %} {% endfor %} {% endfor %}Editar: Acabo de encontrar un enfoque mejor (menos sucio): un campo tiene un
get_bound_field(self, form, field_name)
método según los documentos: https://docs.djangoproject.com/en/1.10/_modules/django/forms/fields/#Field.get_bound_field
Entonces, en su método de subcampo en la última línea (la línea 'rendimiento'), intente esto:
yield self.fields[index].get_bound_field(self, index)Entonces, su plantilla seguirá siendo la misma:
{% for x in myform.subfield %} {{ x }} {% endfor %}y todo debería funcionar como usted pretendía.