【问题标题】:How do I add plain text info to forms in a formset in Django?如何在 Django 的表单集中向表单添加纯文本信息?
【发布时间】:2009-02-20 17:30:00
【问题描述】:

我想在每个表单中显示来自 db 查询的标题和描述,但我不希望它出现在字符字段中,我希望它是 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()

?

【问题讨论】:

  • 我正在尝试为表单集中的每个表单添加标题和描述,但除了添加表单字段之外,我不知道该怎么做。我不想添加更多表单字段,因为我不想标题或描述出现在文本字段中,我希望它是纯文本或 html 格式的文本
  • 我了解模板,我说的是Django的form和formmset对象:docs.djangoproject.com/en/dev/topics/forms/formsets
  • 更新问题而不是添加 cmets 会有所帮助。请编辑您的问题以添加新的事实。
  • 显示文本与表单和表单集有什么关系?请澄清。
  • 我希望每个表单在其字段旁边显示不同的文本,两者都来自查询。我设法通过压缩 formset.forms 与文本元素的关联元组来做到这一点。现在在模板中,我手动在每个表单中编写文本。有没有更惯用的方式来做到这一点?

标签: python django django-forms


【解决方案1】:

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

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 class attributes 提供声明性表单 API 与 instance-level 的方式有些混淆应用于类的各个实例的属性,在本例中是您的表单对象。

【讨论】:

  • 谢谢,这正是我所需要的。
  • 没有问题。请务必使用复选标记表示已接受的解决方案,以便其他人可以轻松找到解决方案并分发一些代表点。
【解决方案2】:

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

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】:

    我必须解决一个类似的问题,并且喜欢你的想法 Andrei。不过,我在使用它时遇到了一些问题,因为如果出现验证错误,只读字段的值就会丢失。为了解决这个问题,我做了类似的事情,但覆盖了 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】:

    我认为您可以通过“{{ 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 %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 2020-01-22
      • 2010-12-29
      • 2013-12-18
      • 2017-11-30
      • 1970-01-01
      相关资源
      最近更新 更多