2016-12-11 197 views
1

昨天我遇到了一個問題,試圖覆蓋Django註冊應用程序的RegistrationForm。從DjangoUserCreationFormRegistrationForm繼承,這是基於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, password2UserCreationForm的相同屬性。此代碼住一個名爲賬戶/ 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')), 
] 

目的這裏覆蓋的輸入域的屬性使用窗口小部件添加屬性,如classplaceholder或更改表格的labels或添加error_messages等。

正如在Django註冊docs中解釋的那樣,您只需將您的自定義表單傳遞給RegistrationViewform_class參數即可。 完成。它不起作用,我不知道爲什麼。

registration_form.html - context analysis

正如你在截圖中看到,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字段被更改。您可以在小部件中看到覆蓋的屬性classplaceholder。但所有其他領域仍然是一樣的。只是一個問題:爲什麼

相反設置的元級的模型和字段屬性在上面報道的方式,我試着用:

class MyRegistrationForm(RegistrationForm): 
    class Meta(RegistrationForm.Meta): 
     widgets = { ... } 

我們並不需要改變這些屬性,我們只在小部件興趣,但結果是一樣的,它不起作用。

我也想知道在項目中更改所有窗體的小部件的最佳方式是什麼。以這種方式覆蓋每個表單?使用模板標籤並過濾每個表單域?使用中間件?如果您使用像引導程序這樣的框架,可能您希望爲每個輸入字段設置屬性class="form-control"。達到此目的的最佳方法是什麼?

感謝您的時間和支持。

回答

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',) 

對我的作品