Django-формы: поднять формы. ValidationError не работает - PullRequest
0 голосов
/ 14 октября 2019

Я новичок в Джанго и недавно изучал валидацию форм. Я реализовал код, но не смог вызвать ValidationError для некоторых ограничений.

Вот мое последующее содержимое файла.

forms.py

from django import forms
from django.core import validators


class formClass(forms.Form):
    name = forms.CharField(max_length=128)
    email = forms.EmailField(max_length=256)
    text = forms.CharField(widget=forms.Textarea)
    catchBot = forms.CharField(required=False, widget=forms.HiddenInput,
                           validators=[validators.MaxLengthValidator(0)])

    def clean(self):
        cleaned_data = super(formClass, self).clean()
        t = self.cleaned_data.get('name')
        if t[0].lower() != 'd':
            raise forms.ValidationError('Name must start with d.')
        return cleaned_data

views.py

from django.shortcuts import render
from formApp import forms
from django.http import HttpResponseRedirect

def formNameView(request):
    formObj = forms.formClass()
    formDict = {'form': formObj}
    if request.method == 'POST':
        formObj = forms.formClass(request.POST)

        if formObj.is_valid():
            # SOME CODE
            print("NAME: " + formObj.cleaned_data['name'])
            print("EMAIL: " + formObj.cleaned_data['email'])
            return HttpResponseRedirect('/users')
    return render(request, 'formApp/forms.html', context=formDict)

Мой действительный ввод отлично работает, но это не происходит с моим неверным вводом.

например: если name = 'Alex', это должно вызвать ошибку. Но это не так. Может ли кто-нибудь помочь мне в этом?

РЕДАКТИРОВАТЬ:

[Добавлены форм. Ранее я использовал validators callable для вызова ValidationError вместо clean() метода. Но результаты были такими же. Вот мой код:

def checkForD(value):
    if value[0].lower() != 'd':
        raise forms.ValidationError('Name must start with d.')
.
.
.
# in my formClass()
name = forms.CharField(max_length=128, validators[checkForD])
...

Forms.html

<body>
<div class='container'>
  <div class='jumbotron'>
    <h3>Welcome to the form page.</h3>
    <h2>Please insert the form.</h2>
  </div>
  <form method="post">
    {{form.as_p}}
    {% csrf_token %}
    <input type="submit" value="Submit" class="btn btn-primary"/>
  </form>
</div>
</body>

1 Ответ

0 голосов
/ 15 октября 2019

В вашем блоке POST вы переопределили formObj, чтобы быть связанной формой, но вы не заменили экземпляр в контексте dict - так что в шаблон передается пустая несвязанная форма, и никаких ошибок не будетв этом шаблоне.

Самое простое решение - переместить определение dict в конец функции:

formDict = {'form': formObj}
return render(request, 'formApp/forms.html', context=formDict)

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

...