【问题标题】:In Django python forms, how do I give a form field a 'second name'?在 Django python 表单中,我如何给表单字段一个“第二个名字”?
【发布时间】:2023-03-25 05:25:01
【问题描述】:

我的网站上有一个表格。该表单是使用 python 循环创建的,它通过变量名调用字段。这是 HTML 代码:

{% csrf_token %}
  {% for form_field in task_form %}
    <div class="wrap-input2 validate-input" data-validate="Name is required">
      <input class="input2" type="text" name="{{ form_field.name }}">
      <span class="focus-input2" data-placeholder="{{ form_field.name }}"></span>
    </div>
  {% endfor %}

变量 {{ form_field.name }} 显示在网站上的每个字段,但它是我想要实际显示的粗略版本。这是在 python 代码中创建字段的方式:

class Task(models.Model):
  name = models.CharField(max_length=200,default = 'Untitled task ',blank=True,)
  description = models.TextField(null=True,blank=True)
  cost = models.DecimalField(max_digits=19,decimal_places=2,null=True,blank=True,default=0)
  profit = models.DecimalField(max_digits=19,decimal_places=2,null=True,blank=True,default=0)
  start_date = models.DateField(null=True,blank=True)
  end_date = models.DateField(null=True,blank=True)
  hours_to_finish = models.IntegerField(null=True,blank=True,default=0)
  hours_finished = models.IntegerField(null=True,blank=True,default=0)
  project= models.ForeignKey(Project,on_delete=models.CASCADE)
  parent_task = models.ForeignKey('self', on_delete= models.SET_NULL ,null=True,blank = True)
  def __str__(self):
    return self.name

有什么方法可以用它的名字来调用表单字段,但是有一个单独的变量绑定到我可以调用以在网站上显示的每个字段,例如 {{ form_field.nickname }}

【问题讨论】:

    标签: python html django forms model


    【解决方案1】:

    您可以在表单中访问fields 字典,因此请参考您的字段:

    <div class="wrap-input2 validate-input" data-validate="Name is required">
      <input class="input2" type="text" name="{{ form.fields.project.name }}">
      <span class="focus-input2" data-placeholder="{{ form.fields.project.name }}"></span>
    </div>
    

    【讨论】:

      【解决方案2】:

      您正在寻找属性Field.label

      如果您从模型创建Form,则模型字段的属性verbose_name 将用作表单字段的标签(如model form docs 中所述)。

      class Task(models.Model):
          ...
          start_date = models.DateField(null=True,blank=True, verbose_name="Date started")
          ...
      
      
      {% csrf_token %}
        {% for form_field in task_form %}
          <div class="wrap-input2 validate-input" data-validate="Name is required">
            <input class="input2" type="text" name="{{ form_field.name }}">
            <span class="focus-input2" data-placeholder="{{ form_field.verbose_name }}"></span>
          </div>
        {% endfor %}
      

      如果你不想改变你的模型,你可以override the defaults when creating the form

      请注意,还有help_text 可用于为字段提供解释。

      【讨论】:

      • verbose_name 解决方案不起作用,但我查看了您提供的帮助文本,并且“标签”策略有效。感谢您提供链接。
      【解决方案3】:

      我单独留下了 models.py,但在 forms.py 中,我将它添加到每个表单的 Meta 类中:

      fields = ('name', 'description', 'cost', 'profit', 'start_date', 'end_date', 'hours_to_finish', 'hours_finished', 'project', 'parent_task')
          labels = {
              'name': ('Task Name'),
              'description': ('Description'),
              'cost': ('Cost'),
              'profit': ('Profit'),
              'start_date': ('Start Date'),
              'end_date': ('End Date'),
              'hours_to_finish': ('Hours Remaining'),
              'hours_finished': ('Hours Completed'),
              'project': ('Parent Project'),
              'parent_task': ('Parent Task'),
          }
      

      只需将字段名称应用于您的表单,括号中的名称将使用 {{ form_field.label }} 而不是 {{ form_field.name }}

      我在 HTML 中这样称呼它:

      {% csrf_token %}
              {% for form_field in task_form %}
              <div class="wrap-input2 validate-input" data-validate="Name is required">
                <input class="input2" type="text" name="{{ form_field.name }}">
                <span class="focus-input2" data-placeholder="{{ form_field.label }}"></span>
              </div>
              {% endfor %}
      

      确保在“字段”数组中包含所有要重命名的字段。

      【讨论】:

        猜你喜欢
        • 2019-12-07
        • 2011-12-20
        • 2011-12-07
        • 2012-03-09
        • 2023-03-08
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        相关资源
        最近更新 更多