【问题标题】:Django crispy forms always renders readonlyDjango 酥脆的表单总是以只读方式呈现
【发布时间】:2023-03-12 04:47:02
【问题描述】:

我正在使用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 设置在其他位置(我认为这与当前问题无关,因为当前问题仅指email_readonly 设置为False 时的奇怪行为)

【问题讨论】:

  • 您在视图中如何使用ContactForm
  • @Alasdair 渲染包含{% crispy form %}render(request, 'main_site/contact.html', context={'form': ContactForm(email_readonly=False)}) 行的模板的标准方法

标签: django django-crispy-forms


【解决方案1】:

这是 Crispy Forms 中的一个已知问题 - 请参阅 #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'),
)

【讨论】:

  • 这正是我为临时解决方法所做的。我想它现在是永久性的:D
猜你喜欢
  • 2012-12-06
  • 2019-12-21
  • 2019-04-26
  • 2018-01-16
  • 2016-01-26
  • 1970-01-01
  • 2014-12-19
  • 2014-02-28
  • 2019-03-17
相关资源
最近更新 更多