<here all loading of static , template_filters, crispy_forms > <form> {% for i in artifact_length %} {% with artifact_name="artifact"|artifact_name:forloop.counter0 %} {{form.artifact_name|as_crispy_field}} {% endwith %} {%endfor%} </form> Este es un código de plantilla relacionado. Aquí quiero representar los campos de formulario con los nombres artifact_0 , artifact_1 como provenientes del formulario. La variable artifact_name dentro funciona with y devuelve los identificadores esperados artifact_0 , artifact_1 , pero quiero usar estas variables como campos de formulario para representar como as_crispy_field . El código {{form.artifact_name|as_crispy_field}} no imprime nada porque asume un formulario como campo con el nombre de artifact_name que no lo es. En su lugar, quiero usar el valor de la variable aquí.
forms.py class Someform(forms.form): def __init__(self, artifact_obj): super().__init__() count = 0 for artifact in artifact_obj: self.fields[f'artifact_{count}'] = forms.CharField(widget=forms.NumberInput()) count += 1 tags.py @register.filter('artifact_name') def get_artifact_name(artifact_prefix: str, counter: int): print('method', 'prefix', artifact_prefix, 'counter', counter) return f'{artifact_prefix}_{counter}' Se está creando un formulario de longitud variable. Al igual que en forms.py , los campos de formulario se crean con artifact_count donde la cuenta puede variar de 0 a len de obj.
No necesita usar filtros/etiquetas de plantilla, etc. para este propósito. La solución más simple sería recorrer los campos del formulario para representarlos:
<form> {% for field in form %} {{ field|as_crispy_field }} {%endfor%} </form>Esto recorrerá todos los campos de su formulario.
Si le preocupa especialmente el orden de estos campos, puede llamar al método de formularios order_fields :
class Someform(forms.form): def __init__(self, artifact_obj, *args, **kwargs): super().__init__(*args, **kwargs) for count, artifact in enumerate(artifact_obj): self.fields[f'artifact_{count}'] = forms.CharField(widget=forms.NumberInput()) self.order_fields(["field_1", "field_2", ...] + [f"artifact_{i}" for i, _ in enumerate(artifact_obj)] + [..., "field_n"])Si en particular desea representar los otros campos por separado, puede agregar un método a su formulario que le permitirá recorrer estos campos:
class Someform(forms.form): def __init__(self, artifact_obj, *args, **kwargs): super().__init__(*args, **kwargs) for count, artifact in enumerate(artifact_obj): self.fields[f'artifact_{count}'] = forms.CharField(widget=forms.NumberInput()) self.artifact_length = len(artifact_obj) def artifact_fields(self): return [self[f'artifact_{i}'] for i in range(self.artifact_length)]Y luego repita estos en la plantilla:
<form> {% for field in form.artifact_fields %} {{ field|as_crispy_field }} {%endfor%} </form>