首页 > 解决方案 > 联系表格不起作用。/contact/ 处的 IntegrityError

问题描述

模型.py

class ContactForm(models.Model):
    name = models.CharField(max_length=50)
    subject = models.CharField(max_length=200)
    email = models.EmailField()
    message = models.TextField()

    def __str__(self):
        return self.name

视图.py

def contact(request):
    if request.method == "POST":
        name = request.POST.get('name')
        subject = request.POST.get('subject')
        email = request.POST.get('email')
        message = request.POST.get('message')
        ContactForm.objects.create(
            name = name,
            subject = subject,
            email = email,
            message = message
        )
        return render(
            request,
            'blog/contact.html',
            {
                'msg':'Details have been saved. We will get back to you.'
            }
        )
    else:
        return render(request, 'blog/contact.html')

联系人.html

{% extends 'blog/base.html' %}
{% block content %}
    <div class="container wrap mb-5" style="margin-top: 100px">
        <h2 class="text">Contact Us</h2>
        <form action="{% url 'contact' %}" method="POST">
            {% csrf_token %}
            <input type="text" placeholder="Enter Your Name" name="name">
            <input type="text" placeholder="Subject" name="subject">
            <input type="email" placeholder="Enter Your Email" name="email">
            <input type="message" placeholder="Write Your Message" name="msg">
            <input type="submit" value="Send" name="Submit">
        </form>
        {% if msg %}
        <div class="alert alert-success">
            {{ msg }}
        </div>
        {% endif %}
    </div>
{% endblock %}

当我单击提交按钮时发生此错误。

表明IntegrityError at /contact/ NOT NULL constraint failed: blog_contacts.message.

标签: pythondjangodjango-forms

解决方案


我在 html 中看到,对于消息输入,名称标签是“msg”,在视图中它是 request.POST.get('message')。因此它找不到那个 post 变量。也没有像“消息”这样的输入类型,所以你也可以改变它,
该行的代码现在看起来像

<input type="text" placeholder="Write Your Message" name="message">

也不建议使用直接的帖子对象,这会使您面临安全漏洞。在使用用户输入之前,您应该使用 Django 表单来清理数据。查看官方文档以获取更多帮助 https://docs.djangoproject.com/en/3.0/topics/forms/


推荐阅读