python - tutorial - Wie füge ich in Formularen in Django einfachen Text Informationen hinzu?




python forms (3)

Ich möchte einen Titel und eine Beschreibung aus einer DB-Abfrage in jedem Formular anzeigen, aber ich möchte nicht, dass es in einem charfield ist, ich möchte, dass es HTML-formatierter Text ist.

Beispielvorlagencode:

{% for form, data in zipped_data %}
   <div class="row">
      <div class="first_col">
         <span class="title">{{ data.0 }}</span>
         <div class="desc">
            {{ data.1|default:"None" }}
         </div>
      </div>
      {% for field in form %}
         <div class="fieldWrapper" style="float: left; ">
            {{ field.errors }}
            {{ field }}
         </div>
      {% endfor %}
{% endfor %}

Ist das der idiomatischste Weg, dies zu tun? Oder gibt es eine Möglichkeit, Text hinzuzufügen, der nicht innerhalb eines Textfelds oder einer Texteingabe in meinem Modell angezeigt wird:

class ReportForm(forms.Form):
   comment = forms.CharField()

?


Ich musste ein ähnliches Problem lösen und mag deine Idee Andrei. Ich hatte jedoch einige Probleme bei der Verwendung, da bei Validierungsfehlern der Wert des schreibgeschützten Feldes verloren gehen würde. Um dies zu lösen, habe ich etwas Ähnliches gemacht, aber HiddenInput stattdessen überschrieben und den Wert in einem versteckten Formularfeld behalten. zB:

class ReadOnlyText(forms.HiddenInput):
    input_type = 'hidden'

    def render(self, name, value, attrs=None):
        if value is None:
            value = '' 
        return mark_safe(value + super(ReadOnlyTextWidget, self).render(name, value, attrs))

class ReportForm(forms.Form):
  comment = forms.CharField(widget=ReadOnlyText, label='comment')

Ich habe gerade ein schreibgeschütztes Widget erstellt, indem ich das Texteingabefeld eins untergliedert habe:

class ReadOnlyText(forms.TextInput):
  input_type = 'text'

  def render(self, name, value, attrs=None):
     if value is None: 
         value = ''
     return value

Und:

class ReportForm(forms.Form):
  comment = forms.CharField(widget=ReadOnlyText, label='comment')

Anstatt die Formulare mit den zusätzlichen Daten zu komprimieren, können Sie den Konstruktor in Ihrem Formular überschreiben und Ihren Titel / Ihre Beschreibung als Membervariablen auf Instanzebene speichern. Dies ist ein bisschen mehr objektorientiert und Lernen, wie Sie dies tun, wird Ihnen helfen, andere Probleme auf der Straße wie dynamische Auswahlfelder zu lösen.

class MyForm (forms.Form):
    def __init__ (self, title, desc, *args, **kwargs):
        self.title = title
        self.desc = desc
        super (MyForm, self).__init__ (*args, **kwargs) # call base class

Dann in Ihrer Sicht Code:

form = MyForm ('Title A', 'Description A')

Passen Sie entsprechend an, wenn Sie diese Werte benötigen, um von der Datenbank zu kommen. Dann greifen Sie in Ihrer Vorlage genauso auf die Instanzvariablen zu, wie Sie sonst noch etwas tun, zB:

   <h1>{{ form.title }}</h1>
   <p>{{ form.desc }}</p>

Aufgrund der Art und Weise, wie Sie Ihre Frage formuliert haben, haben Sie wahrscheinlich etwas Verwirrung darüber, wie Django Python- Klassenattribute verwendet , um eine deklarative Formular-API im Vergleich zu Attributen auf Instanzebene bereitzustellen, die Sie auf einzelne Instanzen einer Klasse anwenden, in diesem Fall Ihre Formularobjekte .





django-forms