Django get_FIELD_display

时间:2010-09-13 20:45:08

标签: django django-forms

我正在尝试访问电子邮件模板中的data.get_age_display。我似乎无法得到这个的显示。我不确定我做错了什么,我之前已经多次使用过get_FIELD_display但是作为上下文传递给普通模板。表格有什么不同吗?

class RequestForm(forms.Form):

    ADULT = 1
    SENIOR = 2
    STUDENT = 3

    AGE_GROUP = (
        (ADULT, 'Adult'),
        (SENIOR, 'Senior'),
        (STUDENT, 'Student'),
    )


    name = forms.CharField(max_length=255)
    phone = forms.CharField(max_length=15)
    age = forms.ChoiceField(choices=AGE_GROUP)
    details = forms.CharField(widget=forms.Textarea())

    def save(self):
        order = Order(
            name = self.cleaned_data['name'],
            phone = self.cleaned_data['phone'],
            age = self.cleaned_data['age'],
            details = self.cleaned_data['details'],
        )
        order.save()

        template = loader.get_template('request_email.txt')

        # send over the order object in an email extracted so they can handle the ticket order
        context = Context({
            'data': order,
        })

        #import pdb; pdb.set_trace()

        email_subject = 'Request Tickets'
        mail_managers(email_subject, template.render(context))

在我的request_email.txt中,我所做的只是{{data.get_age_display}}任何想法?

杰夫

2 个答案:

答案 0 :(得分:0)

您尚未显示您正在创建的订单模型的代码。您确定模型上的age字段设置了choices吗?

您是否没有使用ModelForm?您正在表单的Order方法中创建save()对象,但不返回它。 modelform会为您做到这一点,并且无需重新声明表单的字段。

答案 1 :(得分:0)

我知道这会比被发布的问题晚了WAAAAAY,但这是我对完整性的回答以及其他可能从中受益的人: - )

我将假设在AGE_GROUP中,ADULT,SENIOR和STUDENT是整数。表单清理不会自动清除POST中包含的字符串并返回整数。所以在这段代码中:

context = Context({
    'data': order,
})

你会认为order.age指的是一个整数,但事实上,这是不正确的。它之前烧了几次因为这个正确地将整数保存到物理表中,但是订单实例仍然具有age字段的字符串表示。

你可以做两件事之一:
1.在现场清洁:

clean_age(self):  
    return int(self.cleaned_data['age'])

或创建新的字段类型:

def MyChoiceField(forms.ChoiceField):  
    def clean(self, value):  
        if not value:  
            if self.required:  
                raise forms.ValidationError(self.error_messages['required'])  
                return None  
            else:  
                return None  
        return int(value)

将其链接到表单字段:

age = MyChoiceField(choices=AGE_GROUP)

然后您将来可以将此逻辑应用于任何其他此类选择字段。就个人而言,我发现后者是最好的,我将所有自定义字段类型都粘贴到form_utils文件中,以便我可以在任何地方使用它们。另一个问题是forms.charField不会自动删除输入的文本,你也可以使用这种方法来修复它。