Django表单字段标签 - 如何'if'它属于某个字段

时间:2016-12-19 13:49:18

标签: python django forms formatting label

我有一个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__方法?

1 个答案:

答案 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 |您可以在自定义过滤器中获取该类型,然后返回TrueFalse

修改

事实证明标签应该是来自数据库的动态参数,你可以尝试这样的事情:

在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)