2

Я нашел здесь, в stackoverflow, метод расширения встроенной аутентификации django с использованием сигналов. Моя база Пользователь определяется по «электронной почте» и паролям (поэтому нет имени пользователя). Поэтому я пытаюсь изменить его на свои нужды, но я получаю ошибку проверки для моей формы. Странно то, что ошибка связана с полем User.email, и я получаю «уже использую», хотя я просто регистрируюсь на данный момент. Он пытается сохранить его 2 раза или что? Я обнаружил это, когда я отправлял словарь с данными в контрструктуру формы в оболочке: 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 (forms.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 

ответ

1

Ваш «зарегистрированный пользователем» сигнал отправляется после сохранения Пользователя. Так что у него уже есть поле «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

любые подсказки обходных путей? – muntu

+0

отредактировал мой ответ – owca

0

Проблема:

Ваша форма сначала сохраняется путем регистрации 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.

Смежные вопросы