首页 > 解决方案 > 是否可以为 Django 中的每个表单域添加/删除 HTML 属性

问题描述

我的目标是从我的 django 应用程序中的每个表单字段中删除所需的标签。

我想删除所需的 html 属性,因为我有自己的错误处理并且我不想要所需的 html 工具提示。

在此处输入图像描述

问题是我已经安装了一些 3rd 方库,我也想从他们的表单中删除它。

我考虑过创建一个自定义的 Formrenderer,但我不确定你如何或者你有其他想法。

标签: pythondjango

解决方案


我们可以在方法中设置任何 html 属性__init__

您还可以使用self.fields迭代字段。有关示例,请参见以下表格:

from django import forms
from django.utils.translation import gettext_lazy as _


class ExampleForm(forms.Form):
    q = forms.CharField(required=False, label=_('Search'))
    l = forms.CharField(required=False, label=_('Location'))

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["q"].disabled = True
        self.fields["q"].required = True
        self.fields["q"].widget.attrs["readonly"] = True
        self.fields['q'].widget.attrs['id'] = 'search_type'
        self.fields['q'].widget.attrs['autocomplete'] = 'off'
        self.fields['q'].widget.attrs['placeholder'] = _("Function, Keyword or Company")
        self.fields['q'].widget.attrs.update({'class':"browser-default material-ignore search-input"})

        # iterate over fields
        for field in self.fields:
            self.fields[field].required = False

更新


您还可以使用 javascript(jQuery 或其他东西)在客户端删除所需的属性。如果要在服务器端禁用它,则必须覆盖django-allauth表单。

django-allauth有很好的文档。

您可以覆盖 django-allauth 中的某些表单,请参见以下示例:

from allauth.account.forms import SignupForm, LoginForm


class MyCustomLoginForm(LoginForm):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)   
        # iterate over fields
        for field in self.fields:
            self.fields[field].required = False

    def login(self, *args, **kwargs):

        # Add your own processing here.

        # You must return the original result.
        return super(MyCustomLoginForm, self).login(*args, **kwargs)


class MyCustomSignupForm(SignupForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)   
        # iterate over fields
        for field in self.fields:
            self.fields[field].required = False

    def save(self, request):

        # Ensure you call the parent class's save.
        # .save() returns a User object.
        user = super(MyCustomSignupForm, self).save(request)

        # Add your own processing here.

        # You must return the original result.
        return user

设置.py

ACCOUNT_FORMS = {
    'login': 'mysite.forms.MyCustomLoginForm',
    'signup': 'mysite.forms.MyCustomSignupForm'
}

推荐阅读