我想向从User
导入的内置Django模型from django.contrib.auth.models import User
中添加一些HTML类。
User
模型。
目标:
将form-control
HTML类添加到password1
,password2
和username
字段中。
现在,我了解了如何向表单添加类。感谢Daniel Roseman
。但是现在我又遇到了1个问题。为什么字段password1
和password2
没有得到提供的类?我的表单如下:
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
字段代替password1
和password2
。然后,将提供的HTML类成功应用于此字段。我认为password1
和password2
字段有问题。你觉得呢?
答案 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})
尽管不是password1
或password2
字段,但我还是决定以类似的方式更新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
字段。