昨天我在尝试覆盖Django-Registration app的RegistrationForm时遇到了问题。课程RegistrationForm
继承自UserCreationForm
的{{1}},基于ModelForm
,因此我以这种方式创建了继承自RegistrationForm
的自定义类:
from django import forms
from django.contrib.auth.models import User
class MyRegistrationForm(RegistrationForm):
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
widgets = {
'username': forms.TextInput(
attrs={'placeholder': 'hasdsa', 'class': 'form-control'}),
'email': forms.EmailInput(
attrs={'placeholder': 'hasdsa', 'class': 'form-control'}),
'password1': forms.PasswordInput(
attrs={'placeholder': 'hasdsa', 'class': 'form-control'}),
'password2': forms.PasswordInput(
attrs={'placeholder': 'hasdsa', 'class': 'form-control'}),
}
我以这种方式设置Meta类,因为模型User
和字段username, email, password1, password2
是UserCreationForm
的相同属性。此代码位于名为 accounts / forms.py 的模块中,并以这种方式直接从 accounts / urls.py 调用:
from django.conf.urls import include, url
from registration.backends.hmac import views
from accounts.forms import MyRegistrationForm
urlpatterns = [
url(r'^register/$', views.RegistrationView.as_view(form_class=MyRegistrationForm), name='registration_register'),
url(r'', include('registration.backends.hmac.urls')),
]
此处的目标是覆盖表单输入字段的属性,其中窗口小部件添加class
或placeholder
等属性,或更改表单的labels
或添加error_messages
等等。
正如在Django-Registration Django中所解释的那样,您只需将自定义表单传递给form_class
的{{1}}参数即可。 完成即可。它不起作用,我不知道为什么。
正如您在屏幕截图中看到的,DDT(Django调试工具栏)报告表单的字段以及从那里可用的所有数据。 RegistrationView
标记的输出会返回此结果:
{{ form.as_p }}
错误来自那里。如您所见,只更改了<form method="post" action=".">
<input type='hidden' name='csrfmiddlewaretoken' value='dNeT0R1JPIBtsrGCbcyPQjPLDAW7P7qb' />
<p><label for="id_username">Username:</label> <input class="form-control" id="id_username" maxlength="30" name="username" placeholder="hasdsa" type="text" /> <span class="helptext">Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.</span></p>
<p><label for="id_email">Email:</label> <input id="id_email" name="email" type="email" /> <span class="helptext">email address</span></p>
<p><label for="id_password1">Password:</label> <input id="id_password1" name="password1" type="password" /></p>
<p><label for="id_password2">Password confirmation:</label> <input id="id_password2" name="password2" type="password" /> <span class="helptext">Enter the same password as before, for verification.</span></p>
<input type="submit" value="Submit" />
</form>
字段。您可以在窗口小部件中看到属性username
和class
。但所有其他领域仍然是相同的。只是一个问题:为什么?
而不是按照上面报告的方式设置元类的模型和字段属性,我尝试使用:
placeholder
我们不需要更改这些属性,我们只对小部件感兴趣,但结果是一样的,它不起作用。
我还想知道更改项目中所有表单的小部件的最佳方法是什么。以这种方式覆盖每个表单?使用模板标签并过滤每个表单字段?使用中间件?如果您使用像bootstrap这样的框架,可能您希望每个输入字段都具有属性class MyRegistrationForm(RegistrationForm):
class Meta(RegistrationForm.Meta):
widgets = { ... }
。实现这一目标的最佳方法是什么?
感谢您的时间和支持。
答案 0 :(得分:0)
试试这样:
class SignUpForm(UserCreationForm):
username = forms.Field(widget=forms.TextInput(attrs={'class':'form-control'}))
email = forms.Field(widget=forms.EmailInput(attrs={'class':'form-control'}))
password1 = forms.Field(widget=forms.PasswordInput(attrs={'class':'form-control'}))
password2 = forms.Field(widget=forms.PasswordInput(attrs={'class':'form-control'}))
class Meta:
model = User
fields = ('username','email','password1',)
为我工作
答案 1 :(得分:0)
尝试一下
resume