繁体   English   中英

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

[英]How do I add plain text info to forms in a formset in Django?

我想在每个表单中显示db查询的标题和描述,但我不希望它在charfield中,我希望它是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 %}

这是最惯用的方式吗? 或者,有没有办法添加不会在textarea或文本输入中显示的文本到我的模型:

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

您可以覆盖表单上的构造函数,并将标题/描述保存为实例级成员变量,而不是使用其他数据压缩表单。 这有点面向对象,学习如何做到这一点将有助于您解决其他问题,如动态选择字段。

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 类属性提供声明性表单API与应用于类的各个实例的实例级属性的方式有一些混淆,在这种情况下,您的表单对象。

我只是通过将文本输入字段子类化为一个来创建一个只读小部件:

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

我不得不解决类似的问题,就像你的想法安德烈。 我有一些使用它的问题,因为,如果有验证错误,只读字段的值将丢失。 为了解决这个问题,我做了类似的事情但改写了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')

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM