【问题标题】:django customizing form labelsdjango 自定义表单标签
【发布时间】:2010-04-28 01:34:32
【问题描述】:

我在 Django 表单中自定义标签时遇到问题

这是文件contact_form.py中的表单代码:

from django import forms

class ContactForm(forms.Form):
    def __init__(self, subject_label="Subject", message_label="Message", email_label="Your email", cc_myself_label="Cc myself", *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)

        self.fields['subject'].label = subject_label
        self.fields['message'].label = message_label
        self.fields['email'].label = email_label
        self.fields['cc_myself'].label = cc_myself_label

    subject = forms.CharField(widget=forms.TextInput(attrs={'size':'60'}))
    message = forms.CharField(widget=forms.Textarea(attrs={'rows':15, 'cols':80}))
    email = forms.EmailField(widget=forms.TextInput(attrs={'size':'60'}))
    cc_myself = forms.BooleanField(required=False)

我在其中使用的视图如下:

def contact(request, product_id=None):
    .
    .
    .
    if request.method == 'POST':
        form = contact_form.ContactForm(request.POST)
        if form.is_valid():
            .
            .
        else:
            form = contact_form.ContactForm(
                subject_label = "Subject",
                message_label = "Your Message",
                email_label = "Your email",
                cc_myself_label = "Cc myself")

用于初始化标签的字符串最终将是依赖于语言的字符串,即英语、荷兰语、法语等。

当我测试表单时,不会发送电子邮件,而是表单返回的不是重定向页面:

<QueryDict: {u'cc_myself': [u'on'], u'message': [u'message body'],
u'email':[u'info@umx.com'], u'subject': [u'test message']}>:

主题标签之前的位置。这显然是一个表示表单字段及其内容的字典。

当我将文件contact_form.py更改为:

from django import forms

class ContactForm(forms.Form):
    """
    def __init__(self, subject_label="Subject", message_label="Message", email_label="Your email", cc_myself_label="Cc myself", *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)

        self.fields['subject'].label = subject_label
        self.fields['message'].label = message_label
        self.fields['email'].label = email_label
        self.fields['cc_myself'].label = cc_myself_label
    """
    subject = forms.CharField(widget=forms.TextInput(attrs={'size':'60'}))
    message = forms.CharField(widget=forms.Textarea(attrs={'rows':15, 'cols':80}))
    email = forms.EmailField(widget=forms.TextInput(attrs={'size':'60'}))
    cc_myself = forms.BooleanField(required=False)

即禁用初始化然后一切正常。表单数据通过电子邮件发送,并显示重定向页面。所以很明显,初始化代码是不正确的。但是什么?

非常感谢您的帮助。

【问题讨论】:

    标签: django forms internationalization


    【解决方案1】:

    您应该更改表单 init 声明,打印的 QueryDict 是您在初始化表单时作为第一个参数传递的 request.GET 或 request.POST。

    我想改变这个

    def __init__(self, subject_label="Subject", ...
    

    到这里

    def __init__(self, data=None, subject_label="Subject", ... ...):
        super(ContactForm, self).__init__(data, *args, **kwargs)
        ...
    

    会解决你的问题。

    【讨论】:

    • init 对 data 参数的期望是什么?因为当我添加这个数据参数时 init 抱怨想要 2 个非关键字参数但只得到 1 个。那么在创建表单对象时应该为数据提供什么参数?
    • 你也应该把它传递给超级初始化。这: super(ContactForm, self).__init__(*args, **kwargs) 应该改为: super(ContactForm, self).__init__(data, *args, **kwargs)。我更新了我的答案。
    • 那么创建表单怎么样?因为现在创建一个 ContactForm 对象还需要一个参数来传递给数据。 form = ContactForm(data=... data 的参数是什么?我认为它可能是 request.POST 但最初的表单抱怨所有缺少的必填字段。
    • 非常感谢您的帮助。现在一切似乎都正常了。创建模板的解决方案也有效,但这个解决方案更优雅。
    【解决方案2】:

    我认为您以错误的方式处理问题。您应该改用internationalisatoin 模块。

    这样你就可以有这样的表单:

    class ContactForm(forms.Form):
        subject = forms.CharField(label=_('contact_form_subject'), widget=forms.TextInput(attrs={'size':'60'}))
    

    如果您提供翻译文件,Django 国际化系统会自动为您插入正确的翻译。

    【讨论】:

    • 我知道国际化是一种选择,但这并不能回答我的问题。如何修改表单中的标签。一个选项是使用变量调整模板并完全跳过修改类 ContactForm。
    • 国际化选项是改变标签的解决方案,所以我仍然建议使用它。然而......这不是这里的问题,虽然这也可以解决它;)我不确定为什么它现在不起作用,但我不得不问......是super()部分的缩进只是错误的在这个例子中?因为它应该与self.fields[...].label = '...' 处于同一级别
    • 这里的缩进是错误的。在代码中,它与 self.fields[...].label ...etc 处于同一级别。对困惑感到抱歉。我已经编辑了这个例子。我不使用国际化的原因是国际字符串驻留在数据库中,因此网络管理员/管理员可以轻松地为应用程序添加对新语言的支持。语言支持用于网络文本,也用于以各种语言发布的产品描述和文章。
    • ContactForm类的代码可以看这里:whitemoorstudio.com/site_media/images_misc/ContactForm.jpg
    • 包含错误的代码可以看这里:whitemoorstudio.com/site_media/images_misc/ContactForm.png
    猜你喜欢
    • 2012-05-07
    • 2016-09-20
    • 1970-01-01
    • 2012-07-07
    • 2012-09-17
    • 1970-01-01
    • 2013-07-24
    • 2010-10-10
    • 2011-07-11
    相关资源
    最近更新 更多