我有一个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',那么如何在此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 /
中的TemplateSyntaxError无法解析剩余部分:'{{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__
方法?
答案 0 :(得分:0)
在您的视图中,在传递表单之前,您可以访问表单并检查更改特定的字段类型。您可以通过form.fields[<fieldname>]
和与之关联的属性更改每个字段。
更好的方法是直接在forms.py
或您定义表单的任何地方进行此操作。
class ExampleForm(ModelForm):
class Meta:
model = ExampleModel
fields = ("field1", "field2")
labels = {
"field1": "I have a custom label",
}
如果您确实想在模板中执行此操作,请使用模板标签。
https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/
使用{{forms.field.widget |您可以在自定义过滤器中获取该类型,然后返回True
或False
修改强>
事实证明标签应该是来自数据库的动态参数,你可以尝试这样的事情:
在views.py中
form = ExampleForm(some_label='abc')
在forms.py
中class ExampleForm(forms.Form):
def __init__(self,*args,**kwargs):
self.some_label = kwargs.pop('some_label')
self.fields['some_field'].label = self.some_label
super(ExampleForm, self).__init__(*args,**kwargs)