昨天我遇到了一個問題,試圖覆蓋Django註冊應用程序的RegistrationForm。從DjangoUserCreationForm
類RegistrationForm
繼承,這是基於ModelForm
,所以我創建了自定義類以這種方式從RegistrationForm
繼承:Django註冊:覆蓋默認字段
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'}),
}
我設置的元級以這種方式,因爲模型User
和領域username, email, password1, password2
是UserCreationForm
的相同屬性。此代碼住一個名爲賬戶/ forms.py模塊中,並從賬戶/ 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註冊docs中解釋的那樣,您只需將您的自定義表單傳遞給RegistrationView
的form_class
參數即可。 完成。它不起作用,我不知道爲什麼。
正如你在截圖中看到,DDT(Django的調試工具欄)報告的形式和所有的可用數據從那裏字段。 {{ 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
。但所有其他領域仍然是一樣的。只是一個問題:爲什麼?
相反設置的元級的模型和字段屬性在上面報道的方式,我試着用:
class MyRegistrationForm(RegistrationForm):
class Meta(RegistrationForm.Meta):
widgets = { ... }
我們並不需要改變這些屬性,我們只在小部件興趣,但結果是一樣的,它不起作用。
我也想知道在項目中更改所有窗體的小部件的最佳方式是什麼。以這種方式覆蓋每個表單?使用模板標籤並過濾每個表單域?使用中間件?如果您使用像引導程序這樣的框架,可能您希望爲每個輸入字段設置屬性class="form-control"
。達到此目的的最佳方法是什麼?
感謝您的時間和支持。