2013-05-15 27 views
9

Django 1.5 kullanıyorum & Python 3.2.3.Django 1.5: UserCreationForm ve Özel Kimlik Doğrulama Modeli

Kullanıcı adı yerine bir e-posta adresi kullanan özel bir Auth kurulumu var. modelinde tanımlanmış hiçbir kullanıcı adı yok var. Bu iyi çalışıyor. Yine de, bir kullanıcı oluşturma formu oluşturduğumda, yine de bir kullanıcı adı alanına eklenir. Bu yüzden tam olarak hangi alanları görüntülemek istediğimi tanımlamayı denedim, ancak yine de bir kullanıcı adı alanını formda zorluyor… bile özel auth modelinde bile yok. Bunu yapmayı durdurabilir miyim?

bunun için My formu şöyle tanımlanır:

docs At
class UserCreateForm(UserCreationForm): 

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

, Custom Users and Builtin Forms o "Herhangi bir özel kullanıcı modeli için yeniden yazılmalıdır," diyor ve bence burada yaptığım şey bu. Ne bu ne de UserCreationForm documentation bununla ilgili daha fazla bir şey söylemiyor. Yani neyi kaçırdığımı bilmiyorum. Google üzerinden hiçbir şey bulamadım.

cevap

4

Formunuzu sctratch'den oluşturmanız gerekir, bu UserCreationForm'u genişletmemelidir. UserCreationForm, içinde ve diğer bazı alanlarda açıkça tanımlanmış bir kullanıcı adı alanına sahiptir. Ona here bakabilirsiniz.

+2

Ugh, Django hakkında her şey için, bu çılgın bir şey. Kullanıcı adı olmadan özel bir yetkilendirme yapılmasına izin verir, ancak UserCreationForm'ı bozar. Teşekkürler. En azından, elde ettiğim sonucu elde etmek için yanlış bir şey yapmadığımı biliyorum. – Zamphatta

+1

Ancak dokümanlar bu formun yeniden yazılması gerektiğini söylüyor. Ve yeniden yazma anlamına gelmez, yeni bir – Aldarund

13

Sizin UserCreationForm görünmelidir Ayrıca şifre alanına overrwrite olmayacak bir kullanıcı değişiklik formunu, isteyeceksiniz

# 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 

gibi bir şey: Bu gibi admin

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

    class Meta: 
     model = CustomUser 

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

bu tanımla :

#admin.py 

from .forms import UserChangeForm, UserAddForm 

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

Ayrıca list_display,geçersiz kılmanız gerekir, search_fields, ordering, filter_horizontal, fieldsets ve add_fieldsets (her şey username'dan bahseder), herşeyi listelediğimi düşünüyorum.

+0

kaydetme yönteminde İkiScoops komik görünüyor :) –

+0

Bu TwoScoopsUserCreationForm nerede bulabilirim? – DerShodan

+0

Harika cevap! bana çok yardımcı oldu, teşekkürler :) – Emilcasvi

İlgili konular