在 Django python 表单中,我如何给表单字段一个“第二个名字”?

Posted

技术标签:

【中文标题】在 Django python 表单中,我如何给表单字段一个“第二个名字”?【英文标题】:In Django python forms, how do I give a form field a 'second name'? 【发布时间】:2019-06-04 11:23:39 【问题描述】:

我的网站上有一个表格。该表单是使用 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

【问题讨论】:

【参考方案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 %

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

【讨论】:

以上是关于在 Django python 表单中,我如何给表单字段一个“第二个名字”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在表单完成期间设置外键(python/django)

数据当用户在验证失败(Python,Django)时被重定向回表单时如何保留表单?

如何将 django 表单输入转换为 python 数据?

python Django 如何在表单提交之后页面上仍存在用户填好的数据?

如何使用 Django 的表单框架来选择选项?

Python Django 电子邮件表单示例 [关闭]