Django表单:错误消息始终显示,不仅在错误之后

时间:2016-09-19 10:44:59

标签: python django forms

我正在使用Django的框架构建自己的网站。 我创建了一个用于创建新帐户的表单。它运作良好,但我的错误消息有问题。

当我第一次到达页面时,我的所有错误都已显示。提交后,如果字段错误,则新更新的页面仅显示所需消息。

Here is a view of my page at my first arrival

所以,我的问题是:如果字段错误,我该如何才能显示消息?我已经成功地将每条消息个性化。

我粘贴了我不同的django文件:

views.py

@csrf_exempt
def create_new_user(request):
form = UserCreateForm(request.POST)
if request.method=="POST":
    if form.is_valid():
        user = form.save()
        messages.info(request, "Merci pour votre enregistrement, vous etes maintenant connecte")
        new_user = authenticate(username=form.cleaned_data['username'],
        password=form.cleaned_data['password1']
        )
        login(request, new_user)
        return HttpResponseRedirect('/')
    return render_to_response('lejeudesbars/register.html', RequestContext(request, {'form': form}))
else:
    return render(request, 'lejeudesbars/register.html', {'form': form})

forms.py

class UserCreateForm(UserCreationForm):
    captcha = ReCaptchaField(error_messages={'required': 'Captcha: Validation obligatoire'})
    email = forms.EmailField(required=True)
    username = forms.CharField(error_messages={'required': 'Pseudo: Champ obligatoire'})
    email = forms.EmailField(error_messages={'required': 'Email: Champ obligatoire'})
    password1 = forms.CharField(widget=forms.PasswordInput(), error_messages={'required': 'Mot de passe: Champ obligatoire'})
    password2 = forms.CharField(widget=forms.PasswordInput(), error_messages={'required': 'Mot de passe: Confirmation obligatoire'})


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

    def save(self, commit=True):
        user = super(UserCreateForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user`

的index.html

    <form method="post" action="/accounts/register/">
        {% csrf_token %}
        <h1>S'enregistrer</h1>

        {{ form.username }}
        {% if form.errors %}
        <p class="error-msg-register">{{ form.username.errors }}</p>
        {% endif %}

        {{ form.email }}
        {% if form.errors %}
        <p class="error-msg-register">{{ form.email.errors }}</p>
        {% endif %}

        {{ form.password1 }}
        {% if form.errors %}
        <p class="error-msg-register">{{ form.password1.errors }}</p>
        {% endif %}

        {{ form.password2 }}
        {% if form.errors %}
        <p class="error-msg-register">{{ form.password2.errors }}</p>
        {% endif %}

        {{ form.captcha }}
        {% if form.errors %}
        <p class="error-msg-register">{{ form.captcha.errors }}</p>
        {% endif %}

        <input style="padding: 10px" type="submit" value="Créer mon compte" />
        <input type="hidden" name="next" value="{{ next }}" />
  </form>`

提前感谢您的帮助!

(抱歉我的英语不好)

感谢Daniel Roseman,我已经解决了我的问题。 这是我更新的views.py:

views.py

@csrf_exempt
def create_new_user(request):
    if request.method=="POST":
        form = UserCreateForm(request.POST)
        if form.is_valid():
            user = form.save()
            messages.info(request, "Merci pour votre enregistrement, vous etes maintenant connecte")
            new_user = authenticate(username=form.cleaned_data['username'],
            password=form.cleaned_data['password1']
        )
            login(request, new_user)
    else:
         form = UserCreateForm()
    return render(request, 'lejeudesbars/register.html', {'form': form})

2 个答案:

答案 0 :(得分:4)

如果它实际上是POST,你应该只将request.POST传递给字段。所以:

def create_new_user(request):
    if request.method=="POST":
        form = UserCreateForm(request.POST)
        if form.is_valid():
            ...
    else:
        form = UserCreateForm()
    return render(request, 'lejeudesbars/register.html', {'form': form})

您也不需要中间return render_to_response(...)

答案 1 :(得分:0)

在每个字段中,您有{%if form.errors%} - 所以当至少有一个错误时,您将在任何地方显示它。

将其更改为{% if form.field_name.errors %},然后html应仅呈现与该特定字段相关的错误