如何将HTML类添加到内置的“用户”表单中?

时间:2019-11-16 19:40:10

标签: python django

我想向从User导入的内置Django模型from django.contrib.auth.models import User中添加一些HTML类。


我搜索了大约1天的信息,却一无所获。所有答案仅适用于自行创建的模型,不适用于User模型。

目标:

form-control HTML类添加到password1password2username字段中。


UPD 1:

现在,我了解了如何向表单添加类。感谢Daniel Roseman。但是现在我又遇到了1个问题。为什么字段password1password2没有得到提供的类?我的表单如下:

class UserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ["username", "password1", "password2"]
        widgets = {
            "username": forms.TextInput(attrs={'class': 'form-control'}),
            "password1": forms.PasswordInput(attrs={'class': 'form-control'}),
            "password2": forms.PasswordInput(attrs={'class': 'form-control'}),
        }

渲染时,它仅将form-control类应用于username字段。另外,我尝试仅使用password字段代替password1password2。然后,将提供的HTML类成功应用于此字段。我认为password1password2字段有问题。你觉得呢?

1 个答案:

答案 0 :(得分:0)

UPD 1中使用时,我决定调试此表单中发生的事情。首先,我研究了UserCreationForm的源代码,并尝试使用widget方法更新update字典。看起来像这样:

class UserForm(UserCreationForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.password1.widget.attrs.update({'class': 'form-control'})
        self.password2.widget.attrs.update({'class': 'form-control'})

    ...

但是,下次我打开此表单所在的链接时,出现此错误:

  

AttributeError:“ UserForm”对象没有属性“ password1”

可以找到完整的回溯here(pastebin)。


发生此错误后,我再次查看了UserCreationForm的源代码。我发现在源代码widget中,使用一些不同的语法进行了更新:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    if self._meta.model.USERNAME_FIELD in self.fields:
        self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': True})

尽管不是password1password2字段,但我还是决定以类似的方式更新widget。现在,我覆盖的__init__方法看起来像这样:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields["password1"].widget.attrs.update({'class': 'form-control'})
    self.fields["password2"].widget.attrs.update({'class': 'form-control'})

现在一切都按我的意愿进行。提供的类适用于两个password字段。


但是我仍然认为我做错了什么。如果有人提供更好的方法来实现此结果,我将感到非常高兴。