【问题标题】:django not displaying error_messages in formsdjango 没有在表单中显示 error_messages
【发布时间】: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>

请问我做错了什么

【问题讨论】:

    标签: python-3.x django django-views django-forms django-templates


    【解决方案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
    • 您知道为什么字段错误不起作用。它不会在字段下方或上方写入错误消息
    • 我希望它显示类似 ** 的内容。当有人没有写电子邮件或遗漏它时,请输入有效的电子邮件**
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2017-08-02
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多