django 没有在表单中显示 error_messages

Posted

技术标签:

【中文标题】django 没有在表单中显示 error_messages【英文标题】:django not displaying error_messages in forms 【发布时间】:2021-04-12 13:38:09 【问题描述】:

我是 django 的新手,我正在处理这个表单,我已经尝试了所有可能的方法,但我似乎无法显示表单错误消息。我尝试使用 def clean 方法,当我尝试提交空表单时没有任何反应。我厌倦了使用 FormView 我也尝试使用函数视图我尝试使用 for 循环并添加 form.non_field_errors 在我的模板中没有弹出任何内容。

我的应用程序/forms.py

from django import forms

class ContactForm(forms.Form):

    name = forms.CharField( label='Your Name', min_length=2, max_length=25, required=True, error_messages ='required':'Please tell Oluwafemi your name')
    email = forms.EmailField(label='Your Email', required=True, error_messages='invalid':'Please fill in a valid email')
    subject = forms.CharField(label='Subject', min_length=4, max_length=100, required=True)
    message = forms.CharField(widget=forms.Textarea(attrs='placeholder':'Write Oluwafemi a Message'), error_messages ='required':'Please write something for Oluwafemi')

我的应用/views.py

from django.views.generic import TemplateView
from django.shortcuts import render
from django.core.mail import send_mail
from .forms import ContactForm
from django.http import HttpResponseRedirect

# Create your views here.
class ProfilePageView(TemplateView):
    template_name = 'femi_profile.html'
    form_class = ContactForm
    success_url = 'femiir'

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, 'form': form)

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)

        if form.is_valid():
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']

            # Send the email
            send_mail(
                f"subject - message from name ", # message subject
                message, # Message Body
                email, # Sender's mail (From mail)
                ['d4rahl@gmail.com'], # Reciever's mail(To mail)
            )

            return HttpResponseRedirect('femiir')


        return render(request, self.template_name, 'form': form)

我的html模板的sn-p

<div class="col-lg-7 mt-5 mt-lg-0 d-flex align-items-stretch">
            <form method="post">
              % csrf_token %
              
              <div class="form-row">
                <div class="form-group col-md-6">
                   form.name|as_crispy_field 
                </div>
                <div class="form-group col-md-6">
                   form.email|as_crispy_field 
                </div>
              </div>
              <div class="form-group">
                 form.subject|as_crispy_field 
                 form.message|as_crispy_field 
              </div>
              <div class="text-center"><button type="submit" class="btn btn-primary ">Send Message</button></div>
            </form>
          </div>

请问我做错了什么

【问题讨论】:

【参考方案1】:

您是否尝试循环遍历模板中的 form.errors?

% if form.errors %
    % for field in form %
        % for error in field.errors %
           error   
        % endfor %
    % endfor %
    % for error in form.non_field_errors %
         error 
    % endfor %
% endif %

【讨论】:

我刚刚做了,但没有显示任何内容 还尝试检查表单是否有效,而且我没有看到任何 form.save() 方法,因此表单不会保存在 dB 中。请应用调试器并查看它是否正在进入 form.is_valid() ,如果没有则检查在调试器中查看表单。模板中的表单也没有操作 URL 这似乎很多我对这一切都很陌生......但我没有使用数据库这是一个与我联系的表格,用于仅发送邮件的投资组合项目......我应该在哪里添加form.save() 方法,我不知道如何使用调试器以及什么是操作 URL 试试这个% for hidden_field in form.hidden_fields % hidden_field.errors hidden_field % endfor % 这有帮助吗?否则你可以通过这个simpleisbetterthancomplex.com/article/2017/08/19/…这更容易并且更好地理解 老实说,我从任何地方都不认识你,但我想感谢创造天地的主继续祝福你,愿你翱翔,远超你想象的上帝会升起你高高在上,祝福你的生活......非常感谢【参考方案2】:

当您手动呈现字段时,您将不得不使用错误标签。

form.name_of_field.errors

        <form method="post">
           % csrf_token %
          
          <div class="form-row">
            <div class="form-group col-md-6">
               form.name|as_crispy_field 
               form.name.errors

            </div>
            <div class="form-group col-md-6">
               form.email|as_crispy_field 
               form.email.errors

            </div>
          </div>
          <div class="form-group">
             form.subject|as_crispy_field 
               form.subject.errors

             form.message|as_crispy_field 
               form.message.errors

          </div>
          <div class="text-center"><button type="submit" class="btn btn-primary ">Send Message</button></div>
        </form>

https://docs.djangoproject.com/en/dev/topics/forms/#rendering-fields-manually

【讨论】:

我会试试这个并给你反馈 我刚试过这个,当我尝试提交空表单时,我的表单只会将字段圈成红色 检查您的 ContactForm,您已将字段设置为 required=True。因此,您不能提交空表单。如果字段变为红色,则表示错误运行正常。如果您希望用户提交空表单,请设置 required=False 您知道为什么字段错误不起作用。它不会在字段下方或上方写入错误消息 我希望它显示类似 ** 的内容。当有人没有写电子邮件或遗漏它时,请输入有效的电子邮件**

以上是关于django 没有在表单中显示 error_messages的主要内容,如果未能解决你的问题,请参考以下文章

显示没有输入字段的 Django 表单

显示没有输入字段的 Django 表单

Django:在带有前缀的模板中显示表单名称

显示 ModelForms 的 django 表单验证错误

Django 表单在 html 模板中不起作用,它只是显示按钮

django 中的表单占位符无法正确显示