代码之家  ›  专栏  ›  技术社区  ›  Josh

如何在Django的表单集中向表单添加纯文本信息?

  •  5
  • Josh  · 技术社区  · 17 年前

    示例模板代码:

    {% 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 回复  |  直到 17 年前
        1
  •  13
  •   Community Mohan Dere    9 年前

    您可以重写表单上的构造函数,并将标题/描述保留为 实例级 成员变量。这是一种更面向对象的方法,学习如何做到这一点将帮助您解决其他问题,如动态选择字段。

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

    如果需要这些值来自数据库,请进行相应调整。然后在模板中,您可以像访问其他任何操作一样访问实例变量,例如:

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

    从您提出问题的措辞来看,我认为您可能对Django使用Python的方式有些困惑 应用于类的各个实例的属性,在本例中是窗体对象。

        2
  •  6
  •   Andrei Taranchenko    16 年前

    我刚刚通过将文本输入字段1子类化创建了一个只读小部件:

    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')
    
        3
  •  2
  •   Drew Volpe    17 年前

    我必须解决一个类似的问题,我喜欢你的想法,安德烈。但是我在使用它时遇到了一些问题,因为如果有验证错误,只读字段的值就会丢失。为了解决这个问题,我做了一些类似的事情,但却覆盖了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')
    
        4
  •  0
  •   Mörre    12 年前

    我想你可以用“{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 %}