Django 1.3/Python 2.7을 사용하고 있습니다.장고 관리에서 User.email을 고유하게 유지
내 응용 프로그램은 사용자 관리를 위해 django.contrib.auth를 사용하고 있습니다. 기본 사용자 등록의 경우 '전자 메일'이 이미 등록되어 있는지 확인하는 양식이 있습니다. 따라서 모든 이메일 필드가 고유한지 확인합니다.
하지만 일부 관리자는 django 관리 인터페이스를 사용하여 사용자를 추가하고 동일한 이메일로 중복 계정을 추가하게됩니다.
이 목적을 위해 NewUserCreationForm을 만들었는데 여기서 django.contrib.auth.UserCreationForm을 복제하고 'email'필드를 추가했습니다.
class NewUserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and password.
"""
username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\[email protected]+-]+$',
help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),
error_messages = {'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput,
help_text = _("Enter the same password as above, for verification."))
email = forms.EmailField(label=_("Email"), max_length=75)
class Meta:
model = User
fields = ("username", "email")
def clean_username(self):
username = self.cleaned_data["username"]
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(_("A user with that username already exists."))
def clean_password2(self):
password1 = self.cleaned_data.get("password1", "")
password2 = self.cleaned_data["password2"]
if password1 != password2:
raise forms.ValidationError(_("The two password fields didn't match."))
return password2
def save(self, commit=True):
user = super(NewUserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
user.email = self.email
if commit:
user.save()
return user
class CustomUserAdmin(UserAdmin):
add_form = NewUserCreationForm
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
하지만이 코드는 작동하지 않습니다. 양식 렌더링을 볼 수는 있지만 전자 메일 필드가 없으면 Username, password1 및 password2 필드 만 있습니다.
내가 여기에없는 것은 무엇입니까?
명예는. 참고 : ** ** User ** 대신 ** ** ** ** 확장해야합니다. – jpic
@jpic 네, 우선 연장 할 생각입니다. 저것 DRY. 하지만 장고는 끔찍한 문서 (훌륭한 문서이지만 끔찍한 문서)를 가지고 있으며, UserCreationForm에 한 줄을 넣었습니다. – pcx
설명서가 좋지 않을 수도 있지만 항상 코드 자체를 볼 수 있습니다. –