Django-Registration:覆盖默认字段

时间:2016-12-11 16:48:02

标签: python django forms twitter-bootstrap django-registration

昨天我在尝试覆盖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, password2UserCreationForm的相同属性。此代码位于名为 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')),
]

此处的目标是覆盖表单输入字段的属性,其中窗口小部件添加classplaceholder等属性,或更改表单的labels或添加error_messages等等。

正如在Django-Registration Django中所解释的那样,您只需将自定义表单传递给form_class的{​​{1}}参数即可。 完成即可。它不起作用,我不知道为什么。

docs

正如您在屏幕截图中看到的,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> 字段。您可以在窗口小部件中看到属性usernameclass。但所有其他领域仍然是相同的。只是一个问题:为什么

而不是按照上面报告的方式设置元类的模型和字段属性,我尝试使用:

placeholder

我们不需要更改这些属性,我们只对小部件感兴趣,但结果是一样的,它不起作用。

我还想知道更改项目中所有表单的小部件的最佳方法是什么。以这种方式覆盖每个表单?使用模板标签并过滤每个表单字段?使用中间件?如果您使用像bootstrap这样的框架,可能您希望每个输入字段都具有属性class MyRegistrationForm(RegistrationForm): class Meta(RegistrationForm.Meta): widgets = { ... } 。实现这一目标的最佳方法是什么?

感谢您的时间和支持。

2 个答案:

答案 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