【问题标题】:django crispy forms readonlydjango 脆皮表单只读
【发布时间】:2014-02-28 19:54:06
【问题描述】:

我正在尝试以只读形式将我的一些字段设置为只读。我原以为这很简单,但它不起作用。没有错误,只是不是只读的。

class ApplicationForm(BaseItemForm):

    jira_bucket = forms.CharField(
        widget=autocomplete_light.ChoiceWidget('JiraAutocomplete'))

    def __init__(self, *args, **kwargs):
        ''' Change form based on permissions of the user '''
        super(ApplicationForm, self).__init__(*args, **kwargs)
        # app = self.instance

        if not self.user.has_perm('Assets.sarbox_fields'):

            disabled_widget = forms.CheckboxInput(attrs={'readonly': True})
            self.fields['sarbox'].widget = disabled_widget
            self.fields['pii'].widget = disabled_widget
            self.fields['pci'].widget = disabled_widget
            if 'sarbox_approver' in self.fields:
                self.fields['sarbox_approver'].widget.attrs['disabled'] = True
        # it's about to get crispy
        self.helper = FormHelper()
        # self.helper.form_class = 'application-form'  # done in template
        self.helper.form_tag = False
        self.helper.disable_csrf = True
        self.helper.layout = Layout(
            Div(
                Field('name'),
                Field('jira_bucket'),
            ),
            Row(Field('primary_tech',
                      wrapper_class='col-md-6'),
                Field('primary_biz',
                      wrapper_class='col-md-6')
                ),
            Row(Field('backup_tech',
                      wrapper_class='col-md-6'),
                Field('backup_biz',
                      wrapper_class='col-md-6'),
                ),
            Field('desc', rows=2),
            Div(
                Field('sarbox'),
                Field('pci'),
                Field('pii'),
                css_class='form-inline',
                ),
            Row(
                Field('sarbox_tech_approvers',
                      wrapper_class='col-md-6'),
                Field('sarbox_biz_approvers',
                      wrapper_class='col-md-6'),
                css_id='sarbox_approver'
                ),
            )

    def clean(self):
        cleaned_data = self.cleaned_data
        sarbox = cleaned_data.get('sarbox')
        if sarbox:
            if not (cleaned_data['sarbox_tech_approvers'] and
                    cleaned_data['sarbox_biz_approvers']):
                raise forms.ValidationError("Sarbox applications must have Sarbox Tech and Business approvers assigned.")
        return cleaned_data

【问题讨论】:

  • 发布您的所有表单代码。
  • 当然——添加了。我知道有权限检查,但我将其更改为 if True 以确保这不是问题。
  • 当然,你的意思是你换成if False来检查
  • 不,但我确实将“禁用”改回“只读”。看起来它在编辑中搞砸了。

标签: django django-crispy-forms


【解决方案1】:

我必须在布局中将readonly 参数设置为True,如下所示:

class ContactForm(forms.Form)
  email = forms.EmailField(label='Email')
  api_token = forms.CharField(label='API Token')

  def __init__(self, *args, **kwargs):
    super(ContactForm, self.__init__(*args, **kwargs)
    self.helper = FormHelper()
    self.helper.layout = Layout(
      'email',
      Field('api_token', readonly=True),
    )

【讨论】:

  • 这是最脆的做法
【解决方案2】:

制作禁用/只读小部件:disabled_widget = forms.CheckboxInput(attrs={'disabled': True})

【讨论】:

  • 如何将所有字段变为只读?有没有通用的方法来执行它?也许是 for in 语句?
【解决方案3】:

应该这样:

attrs={'readonly': True}

不是这个吗?

attrs={'readonly': 'readonly'}

【讨论】:

  • 在 HTML 方面,它只需要存在任何值。由于 django 使用字典,因此必须表达一个值,但只有关键存在才重要。
【解决方案4】:

对于列,我必须添加一个只读类

Row(
    Column('created', css_class='col-sm-4 read-only'),
),

然后使用JS选择输入元素

$('.read-only .form-control').prop("disabled", true);

并打开提交以正确保存字段

$('.read-only .form-control').prop("disabled", false);

【讨论】:

    【解决方案5】:

    我在动态指定只读时遇到了一些麻烦,因为 CSS 似乎并不关心您设置的只读值(它只是存在使其成为只读)。我用过:

    weeks_read_only = {}
    if read_only_condition_required:
    weeks_read_only['readonly'] = ''
    
    Field('weeks', css_class='numberinput text-center', **weeks_read_only)
    

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2019-07-27
      • 2014-12-17
      • 1970-01-01
      • 2014-10-27
      • 2015-01-07
      • 2013-12-06
      • 2017-07-22
      • 2013-10-29
      相关资源
      最近更新 更多