Проблема Джанго с проверкой форм - PullRequest
0 голосов
/ 09 мая 2011

Я пытался выяснить, как работает вся эта проверка, но я ее не понимаю.Я прочитал очень мало примеров по djangoproject, но мне не хватает понятий и того, как все связано.

Если бы вы могли посмотреть на мой код и изменить порядок вещей, а также несколько объяснений, это было бы здорово!

Поэтому я хочу сделать что-то очень простое: иметьВойти только с электронной почтой.Когда пользователь вводит свою электронную почту, я хочу проверить, находится ли она в базе данных, и, если это так, войти в систему.если это не так, я хочу вызвать ошибку «пользователь уже в базе данных» и предложить, чтобы этот человек зашел в / register

Итак, что у меня сейчас есть:

view.py:

def emailLogin(request, backend, extra_context=None, initial={}):

form = EmailLoginForm(initial=initial)
if request.method == 'POST':
    form = EmailLoginForm(initial=initial, data=request.POST)
    if form.is_valid():
        user = form.do_save()

        _no_pass_login(request, user) # my custom login
        return redirect('/')

    else:
        print ('not valid')

return render_jinja(request, 'registration/email_login_form.html',
        type="register",
        form = form
        )

forms.py :

class EmailLoginForm(forms.Form):
    email = forms.EmailField()
    def do_save(self):
    try:
            u = User.objects.get(email=self.cleaned_data['email'])
        except :
            raise forms.ValidationError("Already in DB")

        return u

Таким образом, весь смысл в том, что мне не хватает понятий - где должна быть ошибка проверкиподнял, вид или форма?куда это поднято?кто ловит это?что нужно импортировать в каждый файл и т. д.

Это не должно быть слишком сложно, но сейчас я совершенно потерян, и у меня нет примеров, которые я мог бы проанализировать и изменить мой код для работы, поэтому я здесь.

Ответы [ 2 ]

1 голос
/ 09 мая 2011

Я думаю, это то, о чем говорил Даниэль, но это может сбить с толку, если вы точно не знаете, что происходит. По сути, все, что делает форма - это проверка ваших данных. Все сохранение выполняется в виде.

view.py

def emailLogin(request, backend, extra_context=None, initial={}):

    form = EmailLoginForm
    if request.method == 'POST':
        form = form(initial=initial, data=request.POST)
        if form.is_valid():
            _no_pass_login(request, user) # my custom login
            return redirect('/')
        else:
            print 'Form not valid'

    else:
        form = form(initial=initial)

return render_jinja(request, 'registration/email_login_form.html',
    type="register",
    form = form
    )

forms.py

class EmailLoginForm(forms.Form):

    email = forms.EmailField()

    def clean_email(self, *args, **kwargs):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).count() > 0:
            raise ValidationError('User with email "%s" already exists' % email)
        return email
1 голос
/ 09 мая 2011

Да, похоже, вам не хватает некоторых понятий.

Этот тип формы вообще не должен иметь сохранения. И весь смысл проверки is_valid() состоит в том, чтобы отлавливать ошибки проверки - поэтому они должны быть вызваны этим вызовом. Способ сделать это - определить clean методы в форме. В этом случае, поскольку вы проверяете только поле email, вы определяете метод clean_email. Код должен быть идентичен тому, что вы получили в do_save.

Теперь is_valid() вернет False. Но есть несколько настроек, которые, на ваш взгляд, необходимы для того, чтобы на самом деле показать ошибки. Сначала приведите этот else блок назад на один уровень отступа, чтобы он соответствовал if request.method == 'POST'. Теперь вместо этого оператора print переместите туда первую строку - form = EmailLoginForm(initial=initial). Теперь, когда is_valid() имеет значение False, представление перейдет прямо к render_to_response с уже созданной формой, содержащей ошибки проверки. Магия!

...