Django 脆皮表格总是呈现只读
Django crispy forms always renders readonly
我正在使用 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)})`
with True
and False
being set somewhere(我认为这与当前问题无关,因为当前问题仅指 email_readonly
时的奇怪行为设置为 False
)
这是 Crispy Forms 中的一个已知问题 - 请参阅 #326, and #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'),
)
我正在使用 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)})`
with True
and False
being set somewhere(我认为这与当前问题无关,因为当前问题仅指 email_readonly
时的奇怪行为设置为 False
)
这是 Crispy Forms 中的一个已知问题 - 请参阅 #326, and #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'),
)