Django 1.6: форма не показывает ошибок

#python #django #forms

#python #django #формы

Вопрос:

У меня есть форма регистрации, которая не показывает никаких ошибок проверки в шаблоне. Если отправлена неправильная форма, она просто снова отображает страницу с пустыми полями. Я бы хотел, чтобы в ней отображались ошибки, допущенные человеком, регистрирующим форму.

Вот шаблон, в котором у меня есть форма

  <form action="" method="post" id="user_uploader" enctype="multipart/form-data"> {% csrf_token %}
{{ form.non_field_errors }}
<div class="">
    {{ form.name }}
</div>

{{ form.error_messages }}
{{ form.help_text }}
<div class="">
    {{ form.username }}
</div>

{{ form.non_field_errors }}
<div class="">
    {{ form.email}}
</div>

{{ form.non_field_errors }} 
<div class="">
    {{ form.password1 }}
</div>

{{ form.non_field_errors }}
{{ form.error_messages }}
<div class="">
    {{ form.password2 }}
</div>

<button class="btn btn-primary" type="submit" name="submit" id="ss-submit">SIGN UP</button>
  

вот мой forms.py

 class UserCreationForm(forms.ModelForm):
    """
    A form that creates a user, with no privileges, from the given username and
    password.
    """
    error_messages = {
        'duplicate_username': _("A user with that username already exists."),
        'password_mismatch': _("The two password fields didn't match."),
    }
    name = forms.CharField(max_length=200, widget=forms.TextInput(attrs={'class': 'form-control','placeholder':'FirstName LastName'}))
    email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'class': 'form-control','placeholder':'Please enter a valid email address so we can reach you.'}))
    username = forms.RegexField(label=_("Username"), max_length=50,
        regex=r'^[w.@ -] $',
        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."))

    class Meta:
        model = User
        fields = ("name","username","password1","password2","email")

    def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        try:
            User._default_manager.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(
            self.error_messages['duplicate_username'],
            code='duplicate_username',
        )

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError(
                self.error_messages['password_mismatch'],
                code='password_mismatch',
            )
        return password2

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        fullName = self.cleaned_data["name"]
        Email = self.cleaned_data["email"]


        if commit:
            user.save()
            userProfile = DoctorSeeker(user=user, name=fullName, email=Email)
            userProfile.save()

        return user
  

Просто чтобы уточнить, я сохраняю информацию о регистрации в двух разных моделях.

Вот мой views.py

 def signup_user(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST,request.FILES)
        if form.is_valid():
            new_user = form.save()
            new_user = authenticate(username=request.POST['username'],password=request.POST['password1'])
            login(request, new_user)

            return HttpResponseRedirect(reverse('index'))
    else:
        form = UserCreationForm()
    return render(request, "meddy1/signup.html", {'form': form,'usersignup':True})
  

Ответ №1:

Вы вообще не используете form переданный из представления в шаблоне. Вы вручную визуализируете каждый элемент формы. Скорее вы должны использовать предпочтительный способ, как показано в документах здесь

Из этого документа

 <form action="/contact/" method="post">
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Send message" /></p>
</form>
  

Вы можете добавить div s и т.д., чтобы создать html, который вам подходит.

Комментарии:

1. Я следил за документацией и попытался настроить шаблон. Но он по-прежнему не показывает ошибки. Я обновил приведенный выше шаблон.

2. @HarisAghadi, для поля электронной почты будет ошибка {{ form.email.errors}} , вы не используете такие ошибки в поле для отображения.