2009-02-20 7 views
5

Chcę wyświetlić tytuł i opis z zapytania db w każdym formularzu, ale nie chcę, aby był on na charfield, chcę, aby był tekst w formacie HTML.Jak dodać informacje tekstowe do formularzy w zestawie formularzy w Django?

przykładowy kod szablonu:

{% 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 %} 

Jest to najbardziej idiomatyczne sposób to zrobić? Czy istnieje sposób dodania tekstu, który nie będzie wyświetlany wewnątrz tekstu lub tekstu wprowadzonego do mojego modelu:

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

?

+0

Próbuję dodać tytuł i opis do każdej z form w zestawie, ale nie wiem jak to zrobić, oprócz dodawania pól formularza. Nie chcę dodawać kolejnych pól formularza, ponieważ nie chcę, aby tytuł lub opis pojawiał się w polu tekstowym, chcę, aby był prosty lub tekst w formacie HTML. – Josh

+0

Rozumiem szablony, mówię o Django obiekty formularza i formmset: http: //docs.djangoproject.com/en/dev/topics/forms/formsets/ – Josh

+0

Pomaga, jeśli zaktualizujesz pytanie zamiast dodawać komentarze. Edytuj swoje pytanie, aby dodać nowe fakty. –

Odpowiedz

10

Zamiast kompresować formularze za pomocą dodatkowych danych, można zastąpić konstruktora w formularzu i zachować tytuł/opis jako zmienne składowe na poziomie dla instancji na poziomie. Jest to nieco bardziej obiektowe i uczenie się, jak to zrobić, pomoże rozwiązać inne problemy na drodze, takie jak dynamiczne pola wyboru.

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 

Następnie w kodzie Widok:

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

Dostosuj odpowiednio, jeśli potrzebujesz tych wartości pochodzą z bazy danych. Następnie w szablonie, uzyskać dostęp do zmiennych instancji jak zrobisz cokolwiek innego, np:

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

Od sposób sformułowane pytanie, myślę, że prawdopodobnie masz pewne zamieszanie wokół sposób Django używa Python klasy atrybutów, aby zapewnić deklaratywny formularz API w porównaniu z poziomu instancji atrybutów stosowanych do poszczególnych instancji klasy, w tym przypadku do obiektów formularza.

+0

Dziękuję, to było dokładnie to, czego potrzebowałem. – Josh

+0

Brak prob. Upewnij się, że używasz znacznika wyboru dla zaakceptowanego rozwiązania, aby inni mogli łatwo znaleźć rozwiązanie i rozdać punkty rep. –

+0

Awesome, jest zaznaczone. – Josh

4

Właśnie stworzył tylko do odczytu przez widget instacji pola tekstu wejściowego One:

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

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

oraz:

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

Musiałem rozwiązać podobny problem i podoba Ci się twój pomysł, Andrei. Miałem pewne problemy z jego używaniem, ponieważ jeśli wystąpiłyby błędy sprawdzania poprawności, wartość pola tylko do odczytu zostałaby utracona. Aby rozwiązać ten problem, zrobiłem coś podobnego, ale zamiast tego przeszedłem HiddenInput i zachowałem wartość w ukrytym polu formularza. tj:

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') 
0

Myślę, że można go uzyskać z "{{field.value}}". Może to łatwiejszy sposób.

Powiązane problemy