Простая форма не проверяется - PullRequest
2 голосов
/ 06 июля 2010

Я нашел здесь в stackoverflow метод расширения встроенной аутентификации django с помощью сигналов.Мой базовый пользователь определен «электронной почтой» и паролями (поэтому там нет имени пользователя).Поэтому я пытаюсь изменить его в соответствии с моими потребностями, но получаю ошибку проверки для моей формы.Странно то, что ошибка связана с полем User.email, и я получаю «уже используемый», хотя я только сейчас регистрируюсь.Он пытается сохранить его 2 раза или как?Я обнаружил это, когда отправлял словарь с данными в contstructor формы в оболочке: form = MyForm(data={}).После того, как эта форма все еще была недействительной, но изменение адреса электронной почты на другое значение, наконец, дало мне True.

Функция user_created, связанная с сигналом регистрации:

def user_created(sender, user, request, **kwargs):
    form = CustomRegistrationForm(request.POST, request.FILES)
    if form.is_valid():
        data = UserProfile(user=user)
        data.is_active = False
        data.first_name = form.cleaned_data['first_name']
        data.last_name = form.cleaned_data['last_name']
        data.street = form.cleaned_data['street']
        data.city = form.cleaned_data['city']
        data.save()
    else:
        return render_to_response('user/data_operations/error.html', {'errors': form._errors}, context_instance=RequestContext(request))

user_registered.connect(user_created)

Моя форма:

class CustomRegistrationForm(RegistrationForm):
    first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    street = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)

Моя модель:

class UserProfile(models.Model):
    first_name = models.CharField(_("Name"), max_length=50, blank=False,)
    last_name = models.CharField(_("Last name"), max_length=50, blank=False,)
    street = models.CharField(_("Street"), max_length=50, blank=False,)
    city = models.CharField(_("City"), max_length=50, blank=False,) 
    user = models.ForeignKey(User, unique=True, related_name='profile',)

Форма регистрации: класс RegistrationForm (форм. Form):

email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
                                                           maxlength=75)),
                         label=_("Adres email"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo powtorzone"))

def clean_email(self):
    email = self.cleaned_data.get("email")
    if email and User.objects.filter(email=email).count() > 0:
        raise forms.ValidationError(
            _(u"Already in use."))
    return email

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Ваш 'user_registered' сигнал отправляется после сохранения пользователя. Так что в нем уже определено поле 'email'.

UPDATE


Использование беспокойного мышления:

form = CustomRegistrationForm(request.POST, request.FILES, notvalidateemail=True)

и в форме:

def __init__(self, *args, **kwargs):
    self.notvalidateemail = kwargs.pop('notvalidateemail',False)
    super(CustomRegistrationForm, self).__init__(*args, **kwargs)

def clean_email(self):
    if self.notvalidateemail:
        return
    else:
        #your cleaning here
        return email
0 голосов
/ 06 июля 2010

Проблема:

Ваша форма сначала сохраняется при регистрации django.Затем вы сохраняете его снова в user_created.

Решения:

  1. Используйте другую форму в user_created.Тот, который не будет уже сохранены поля (это из модели пользователя, как электронная почта).Вы просто хотите сохранить дополнительные данные в user_created, верно?

  2. Добавьте некоторые параметры в форму, например:

в user_created:

form = CustomRegistrationForm(dontvalidateemail=True, request.POST, request.FILES)

и в форме init ;

self.dontvalidateemail = dontvalidateemail

, затем просто отметьте это в clean_email.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...