2013-05-15 14 views
9

Tôi đang sử dụng Django 1.5 & Python 3.2.3.Django 1.5: UserCreationForm & Mô hình xác thực tùy chỉnh

Tôi có thiết lập Xác thực tùy chỉnh, sử dụng địa chỉ email thay vì tên người dùng. Có không có tên người dùng được xác định trong mô hình. Điều đó hoạt động tốt. Tuy nhiên, khi tôi tạo một biểu mẫu tạo người dùng, dù sao nó vẫn thêm vào trường tên người dùng. Vì vậy, tôi đã cố gắng xác định chính xác những trường nào tôi muốn hiển thị, nhưng nó vẫn buộc một trường tên người dùng vào biểu mẫu anyway .... thậm chí tho nó thậm chí không tồn tại trong mô hình auth tùy chỉnh. Làm thế nào tôi có thể làm cho nó ngừng làm điều đó?

hình thức của tôi cho điều này được xác định như sau:

class UserCreateForm(UserCreationForm): 

    class Meta: 
     model = MyUsr 
     fields = ('email','fname','surname','password1','password2', 
        'activation_code','is_active') 

Tại các tài liệu, các Custom Users and Builtin Forms nói nó "Phải được viết lại cho bất kỳ mô hình người dùng tùy chỉnh" và tôi nghĩ đó là những gì tôi đang làm ở đây. Không phải điều này, cũng không phải là UserCreationForm documentation nói bất cứ điều gì thêm về điều này mặc dù. Vì vậy, tôi không biết những gì tôi đang mất tích. Tôi cũng không tìm thấy gì qua Google.

Trả lời

4

Bạn cần tạo biểu mẫu của mình từ sctratch, nó không được mở rộng UserCreationForm. UserCreationForm có một trường tên người dùng được định nghĩa rõ ràng trong nó cũng như một số trường khác. Bạn có thể xem nó here.

+2

Ugh, vì tất cả những điều tốt đẹp về Django, đây là một chút điên khùng. Chúng cho phép một auth tùy chỉnh được thực hiện mà không có tên người dùng, nhưng nó phá vỡ UserCreationForm. Cảm ơn. ít nhất tôi biết tôi không làm gì sai để có được kết quả tôi đã nhận được. – Zamphatta

+1

Nhưng các tài liệu nói rằng biểu mẫu này nên được viết lại. Và viết lại không có nghĩa là mở rộng từ nó, nó có nghĩa là một cái mới – Aldarund

13

bạn UserCreationForm nên giống như thế

# forms.py 
from .models import CustomUser 

class UserCreationForm(forms.ModelForm): 
    password1 = forms.CharField(label="Password", widget=forms.PasswordInput) 
    password2 = forms.CharField(label="Password confirmation", widget=forms.PasswordInput) 

    class Meta: 
     model = CustomUserModel 
     # Note - include all *required* CustomUser fields here, 
     # but don't need to include password1 and password2 as they are 
     # already included since they are defined above. 
     fields = ("email",) 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      msg = "Passwords don't match" 
      raise forms.ValidationError("Password mismatch") 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

Bạn cũng sẽ muốn có một hình thức sử dụng thay đổi, mà sẽ không overrwrite trường mật khẩu:

class UserChangeForm(forms.ModelForm): 
    password = ReadOnlyPasswordHashField() 

    class Meta: 
     model = CustomUser 

    def clean_password(self): 
     # always return the initial value 
     return self.initial['password'] 

Xác định những trong quản trị của bạn như thế này :

#admin.py 

from .forms import UserChangeForm, UserAddForm 

class CustomUserAdmin(UserAdmin): 
    add_form = UserCreationForm 
    form = UserChangeForm 

Bạn cũng cần phải ghi đè list_display, list_filter, search_fields, ordering, filter_horizontal, fieldsetsadd_fieldsets (mọi thứ trong django.contrib.auth.admin.UserAdmin đề cập đến username, tôi nghĩ mình đã liệt kê tất cả).

+0

TwoScoops trong phương pháp tiết kiệm trông buồn cười :) –

+0

Tôi có thể tìm thấy TwoScoopsUserCreationForm này ở đâu? – DerShodan

+0

Câu trả lời hay! nó đã giúp tôi rất nhiều, cảm ơn :) – Emilcasvi