【发布时间】:2023-03-18 00:24:01
【问题描述】:
我有一个 Django 表单,表单的字段/字段标签都使用for 循环显示:
{% load utilities %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
{% if field|is_checkbox %}
<tr><td colspan="1">{{field}}</td><td colspan="6"><label>{{field.label}}</label></td></tr>
{% else %}
<tr><td colspan="7"><label>{{field.label}}</label></td></tr>
<tr><td colspan="7">{{field}}
</td></tr>
{% endif %}
{% endfor %}
我想为这个 for 循环显示的某些字段的标签添加一些文本(如果该字段是“日期”字段,我想指示用户以“dd/mm/”格式输入值yyyy hh:mm')。
我知道如果该字段是'date'字段,它的名称将包含'date'这个词,那么我如何在if语句中嵌套一个if,以表示:
if field.name contains "date":
field.name = field.name + "dd/mm/yyyy hh:mm"
我了解如何执行此操作的逻辑,我只是不确定 Python 语法...会不会是这样的:
{% if "string" in {{field.name}} %}
{{field.name}} = {{field.name}} + " (dd/mm/yyyy hh:mm)"
我试了一下,但我的浏览器显示语法错误:
/projects/5915/info/ 处的模板语法错误
无法解析余数:来自“{{field.label}}”的“{{field.label}}”
编辑
我的表单定义目前如下所示:
class CdiInitialDetailsForm(ValidatedForm):
""" Top left box on CDI Proposal tab. Updated budget not part of the form, in HTML """
vat_status = forms.ChoiceField(choices=[(0, 0),(5,5),(20,20)], required=False,)
meeting_date = mDateTimeField(required=False, label="Site visit date (dd/mm/yyyy hh:mm)", widget=forms.DateTimeInput(format='%d/%m/%Y %H:%M'))
discussed_budget_updated = forms.IntegerField(required=False, widget=forms.NumberInput(attrs=({'class':'currency'})), label='Updated budget exc VAT')
discussed_budget_updated_inc = forms.IntegerField(required=False, widget=forms.NumberInput(attrs=({'readonly':'readonly', 'class':'currency'})), label="Inc vat")
site_visitor_1 = forms.CharField()
site_visitor_2 = forms.CharField()
class Meta:
model = InitialDetails
fields = ['chance','vat_status','discussed_budget_updated','discussed_budget_updated_inc','meeting_date','site_visitor_1','site_visitor_2']
labels = {
"meeting_date": "Meeting date (dd/mm/yyyy hh:mm): "
}
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance', {})
project = instance.project
#Get site visit date, who visited site, vat status
try:
meeting = project.meetings.get(purpose=1)
meeting_date = meeting.date
except ObjectDoesNotExist:
meeting_date = None
visited_site = project.assigned.select_related('employee').filter(role=Role.VS)
try: site_visitor_1 = visited_site[0].employee.id
except IndexError: site_visitor_1 = None
try: site_visitor_2 = visited_site[1].employee.id
except IndexError: site_visitor_2 = None
try: vat_status = project.vat_status
except: vat_status = 0
try: discussed_budget_updated = int(round(instance.discussed_budget_updated))
except: discussed_budget_updated = None
try: discussed_budget_updated_inc = int(round(instance.discussed_budget_updated_inc_vat))
except: discussed_budget_updated_inc = None
initial = kwargs.get('initial', {})
initial={
'meeting_date': meeting_date,
'vat_status': vat_status,
'site_visitor_1': site_visitor_1,
'site_visitor_2': site_visitor_2,
'discussed_budget_updated': discussed_budget_updated,
'discussed_budget_updated_inc': discussed_budget_updated_inc,
}
kwargs['initial'] = initial
super(CdiInitialDetailsForm, self).__init__(*args, **kwargs)
self.fields['site_visitor_1'] = AutoFlexiSelect(model='e', choices=get_choices('EMPLOYEE_CHOICES'), current_id=site_visitor_1, label="Who visited site")
self.fields['site_visitor_2'] = AutoFlexiSelect(model='e', choices=get_choices('EMPLOYEE_CHOICES'), current_id=site_visitor_2, label="&")
chance = self.instance.chance
if chance:
in_choices = [choice for choice in InitialDetails.CHANCE_CHOICES if chance in choice]
if not in_choices:
self.fields['chance'].choices = [(chance, chance)] + self.fields['chance'].choices
self.fields['chance'].initial = chance
我需要将labels 添加到__init__ 方法吗?
【问题讨论】:
-
您是否尝试在模板中更新
field的值?或者,只想显示{{field.name}} + " (dd/mm/yyyy hh:mm)"的值? -
我只是想将字段的标签更改为
{{field.name}} (dd/mm/yyyy hh:mm),实际字段本身以'dd/mm/yyyy hh:mm'格式输入,所以我想添加该格式指令到字段标签,以便用户知道在字段中键入什么格式。 -
该字段有验证,因此它不会接受任何非此格式的输入,但目前,没有任何东西向用户表明这是他们应该使用的格式在字段中输入。
-
不确定,但我认为您不能在模板中做到这一点。我认为您应该创建一个模板标签来将内容转换为您想要的值
标签: python django forms formatting label