1

Ich versuche, ein Formular dynamisch zu generieren und Einrückung von Formularfeldern zuzuweisen. Ich versuche, ein benutzerdefiniertes Attribut Offset Formular.CharField in Unterklasse zuzuweisen. Ich plane, diese Logik zu verwenden, um ein Formular dynamisch aus einer XML-Datei zu erstellen, in der die Felder basierend auf der Tiefe des Knotens eingerückt werden.Django Formularfeld Benutzerdefinierte Attributzuweisung und Verwendung in Vorlage

Ich kann den Wert des Offsets beim Rendern der Vorlage nicht abrufen und daher den Parameter Margin-left style nicht zuordnen. Die endgültige HTML-Ausgabe wird ebenfalls angezeigt.

Kann jemand bitte helfen. Ich habe einige andere Antworten auf dieser Site gesucht, wo es scheint, dass beliebige Attribute in der Vorlage zugewiesen und abgerufen werden können. z.B. as in thread here where an arbitrary label_class attribute is assigned

Meine forms.py Datei:

class MyCharField(forms.CharField): 
    def __init__(self, *args, **kwargs): 
     self.offset = kwargs.pop('offset', 0) 
     super(MyCharField, self).__init__(*args, **kwargs) 


class MyDynamicForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyDynamicForm, self).__init__(*args, **kwargs) 
     self.fields["Field_A"] = MyCharField(label="Input A", offset="5") 
     self.fields["Offset_Field_B"] = MyCharField(label="Input B", offset="50") 

Meine Views.py wie folgt aussieht:

{% extends 'demo/base.html' %} 
{% load bootstrap3 %} 
{% block content %} 
    <form role="form" method="post"> 
     {% csrf_token %} 
     {% for field in form %} 
     <div class="form-group bootstrap3-required"> 
      <label class="col-md-3 control-label " style = "margin-left: {{field.offset}}px" for="{{ field.name }}">{{ field.label}}</label> 
      <div class="col-md-9"> 
       <input class="form-control" id="id_{{field.name}}" name="{{ field.name }}" placeholder="{{field.label}}" style="margin-left:{{field.offset}}px" title="" required="" type="text"/> 
      </div> 
     </div> 
     {% endfor %} 
     {% buttons submit='OK' reset='Cancel' layout='horizontal' %}{% endbuttons %} 
    </form> 
{% endblock %} 

The:

class MyDynamicView(View): 
    template_name = 'demo/myform.html' 
    form_class = MyDynamicForm 

    def get(self, request, *args, **kwargs): 
     form = self.form_class() 
     return render(request, self.template_name, {'form': form}) 

Meine Vorlagendatei Bootstrap verwenden wie folgt aussieht HTML-Ausgabe ist:

<form role="form" method="post"> 
    <input type='hidden' name='csrfmiddlewaretoken' value='lTy0rc2r9KNiNNPosUoriUlNzYBpgoVpael1MYLOczFECO7H7LXdES6EGBhUoXx0' /> 


    <div class="form-group bootstrap3-required"> 
     <label class="col-md-3 control-label " style = "margin-left: px" for="Field_A">Input A</label> 
     <div class="col-md-9"> 
      <input class="form-control" id="id_Field_A" name="Field_A" placeholder="Input A" style="margin-left:px" title="" required="" type="text"/> 
     </div> 
    </div> 

    <div class="form-group bootstrap3-required"> 
     <label class="col-md-3 control-label " style = "margin-left: px" for="Offset_Field_B">Input B</label> 
     <div class="col-md-9"> 
      <input class="form-control" id="id_Offset_Field_B" name="Offset_Field_B" placeholder="Input B" style="margin-left:px" title="" required="" type="text"/> 
     </div> 
    </div> 


    <div class="form-group"><label class="col-md-3 control-label">&#160;</label><div class="col-md-9"><button class="btn btn-default" type="submit">OK</button> <button class="btn btn-default" type="reset">Cancel</button></div></div> 
</form> 

Antwort

1

Eine Instanziierung aus CharField ist nicht erforderlich. Wahrscheinlich wird eine solche Initialisierung des Feldes in Form genug für Sie sein:

field_a = forms.CharField('Input_A', 
           widget=forms.TextInput(attrs={'placeholder': 'Input_A', 'style': 'margin-left: 50px'})) 
Verwandte Themen