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

0 python forms django

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

\n\n

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

\n\n

这是我第一次到达时的页面视图

\n\n

所以,我的问题是:如何才能仅在字段错误时显示消息?我已经成功地对每条消息进行了个性化设置。

\n\n

我将我的不同 django 文件粘贴给你:

\n\n

视图.py

\n\n
@csrf_exempt\ndef create_new_user(request):\nform = UserCreateForm(request.POST)\nif request.method=="POST":\n    if form.is_valid():\n        user = form.save()\n        messages.info(request, "Merci pour votre enregistrement, vous etes maintenant connecte")\n        new_user = authenticate(username=form.cleaned_data[\'username\'],\n        password=form.cleaned_data[\'password1\']\n        )\n        login(request, new_user)\n        return HttpResponseRedirect(\'/\')\n    return render_to_response(\'lejeudesbars/register.html\', RequestContext(request, {\'form\': form}))\nelse:\n    return render(request, \'lejeudesbars/register.html\', {\'form\': form})\n
Run Code Online (Sandbox Code Playgroud)\n\n

表格.py

\n\n
class UserCreateForm(UserCreationForm):\n    captcha = ReCaptchaField(error_messages={\'required\': \'Captcha: Validation obligatoire\'})\n    email = forms.EmailField(required=True)\n    username = forms.CharField(error_messages={\'required\': \'Pseudo: Champ obligatoire\'})\n    email = forms.EmailField(error_messages={\'required\': \'Email: Champ obligatoire\'})\n    password1 = forms.CharField(widget=forms.PasswordInput(), error_messages={\'required\': \'Mot de passe: Champ obligatoire\'})\n    password2 = forms.CharField(widget=forms.PasswordInput(), error_messages={\'required\': \'Mot de passe: Confirmation obligatoire\'})\n\n\n    class Meta:\n        model = User\n        fields = ("username", "email", "password1", "password2")\n\n    def save(self, commit=True):\n        user = super(UserCreateForm, self).save(commit=False)\n        user.email = self.cleaned_data["email"]\n        if commit:\n            user.save()\n        return user`\n
Run Code Online (Sandbox Code Playgroud)\n\n

索引.html

\n\n
    <form method="post" action="/accounts/register/">\n        {% csrf_token %}\n        <h1>S\'enregistrer</h1>\n\n        {{ form.username }}\n        {% if form.errors %}\n        <p class="error-msg-register">{{ form.username.errors }}</p>\n        {% endif %}\n\n        {{ form.email }}\n        {% if form.errors %}\n        <p class="error-msg-register">{{ form.email.errors }}</p>\n        {% endif %}\n\n        {{ form.password1 }}\n        {% if form.errors %}\n        <p class="error-msg-register">{{ form.password1.errors }}</p>\n        {% endif %}\n\n        {{ form.password2 }}\n        {% if form.errors %}\n        <p class="error-msg-register">{{ form.password2.errors }}</p>\n        {% endif %}\n\n        {{ form.captcha }}\n        {% if form.errors %}\n        <p class="error-msg-register">{{ form.captcha.errors }}</p>\n        {% endif %}\n\n        <input style="padding: 10px" type="submit" value="Cr\xc3\xa9er mon compte" />\n        <input type="hidden" name="next" value="{{ next }}" />\n  </form>`\n
Run Code Online (Sandbox Code Playgroud)\n\n

预先感谢您对我的帮助!

\n\n

(对不起,我的英语不好)

\n\n
\n\n

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

\n\n

视图.py

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

Dan*_*man 5

仅当 request.POST 实际上是 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})
Run Code Online (Sandbox Code Playgroud)

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