Как добавить текстовую информацию в формы в наборе форм в Django? - PullRequest
5 голосов
/ 20 февраля 2009

Я хочу показать заголовок и описание из запроса базы данных в каждой форме, но я не хочу, чтобы это было в поле char, я хочу, чтобы это был текст в формате HTML.

пример кода шаблона:

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

Это самый идиоматический способ сделать это? Или есть способ добавить текст, который не будет отображаться внутри текстовой области или ввода текста в моей модели:

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

Ответы [ 4 ]

10 голосов
/ 21 февраля 2009

Вместо того, чтобы архивировать формы с дополнительными данными, вы можете переопределить конструктор в вашей форме и оставить заголовок / описание в виде уровня экземпляра переменных-членов. Это немного более объектно-ориентировано, и изучение того, как это сделать, поможет вам решить другие проблемы в будущем, такие как поля динамического выбора.

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

Тогда, на ваш взгляд, код:

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

Отрегулируйте соответственно, если вам нужны эти значения из базы данных. Затем в вашем шаблоне вы получаете доступ к переменным экземпляра так же, как вы делаете что-либо еще, например ::10000

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

Исходя из того, как вы сформулировали свой вопрос, я думаю, что у вас, вероятно, есть некоторая путаница в связи с тем, как Django использует атрибуты класса Python * для предоставления декларативного API формы против атрибутов уровня экземпляра , которые вы применяете к отдельным экземплярам класса, в данном случае к объектам формы.

5 голосов
/ 22 февраля 2009

Я только что создал виджет только для чтения, подклассифицировав одно поле ввода текста:

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

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

А:

class ReportForm(forms.Form):
  comment = forms.CharField(widget=ReadOnlyText, label='comment')
2 голосов
/ 15 мая 2009

Мне пришлось решить похожую проблему и мне понравилась твоя идея, Андрей. У меня были некоторые проблемы с его использованием, хотя, как если бы были ошибки проверки, значение поля только для чтения потеряно. Чтобы решить эту проблему, я сделал нечто подобное, но вместо этого переопределил HiddenInput и сохранил значение в скрытом поле формы. то есть:

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 голосов
/ 25 ноября 2013

Я думаю, что вы можете получить это с "{{field.value}}". Может быть, это более простой способ.

{% for form in formset %}
    {% for field in form %}
        {% if forloop.counter = 1 %}
            <td><img src="{{ MEDIA_URL }}{{ field.value }}"/></td>
        {% endif %}
        {% if forloop.counter = 2 %}
            <td>{{ field.value }}</td>
        {% endif %}
        {% if forloop.counter > 2 %}
            <td>{{ field }}{{ field.errors }}</td>
        {% endif %} 
    {% endfor %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...