Django crispy表单总是呈现readonly

时间:2016-08-09 12:55:57

标签: django django-crispy-forms

我正在使用django-cripy-forms我希望将字段设为只读或不依赖,具体取决于我的代码中发生的其他事情。我目前的表单代码如下:

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, Submit
from django import forms
from .models import Contact


class ContactForm(forms.ModelForm):
    class Meta:
        model = Contact
        exclude = ['author']

    contact_email = forms.EmailField()
    content = forms.CharField(widget=forms.Textarea(), required=True)

    def __init__(self, email_readonly=False, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_id = 'contact-form'
        self.helper.layout = Layout(
            Field('contact_email', readonly=email_readonly),
            Field('content'),
            Submit('', 'Send')
        )

但是这总是将contact email字段呈现为只读。

事实上,我注意到该字段不是只读的唯一方法是密钥readonly是否甚至不出现在Field构造函数中,即

Field('contact_email', readonly=False),

具有完全相同的效果
Field('contact_email', readonly=True),

虽然我希望它与

具有相同的效果
Field('contact_email'),

这是一个错误还是我滥用代码?

修改

在我的模板中,我有两行

{% load crispy_forms_tags %}

{% crispy form %}

我正在使用

渲染模板
render(request, 'main_site/contact.html', context={'form':ContactForm(email_readonly=False)})`

render(request, 'main_site/contact.html', context={'form':ContactForm(email_readonly=True)})`

TrueFalse设置在其他地方(我不认为这与当前问题相关,因为当前的问题只涉及{时的奇怪行为' {1}}设置为email_readonly

1 个答案:

答案 0 :(得分:1)

这是Crispy表单中的一个已知问题 - 请参阅#326#257,这是问题的根源。

readonly属性是布尔属性而不是键值属性,即您可以像这样使用它:

<input name='foo' readonly>

属性的存在意味着该字段是只读的。

Crispy表单不处理这样的布尔属性(required attribute除外,它具有特殊情况)并且只是将它们呈现为任何其他属性。

这是一个问题,因为就您的浏览器而言,readonly="true"readonly="false"是一回事。仅存在该属性将导致该字段为只读。

你可以做一些像这样的解决方法:

self.helper.layout = Layout(
    Field('contact_email', readonly=True) if email_readonly else Field('contact_email'),
)