django.db.utils.IntegrityError: NOT NULL 约束失败: Eid_Post_name



我有这个问题:

"django.db.utils.IntegrityError: NOT NULL constraint failed: Eid_Post_name.massenger_name 

这些是我的代码。

views.py:

from django.shortcuts import render
from .models import Name
# Create your views here.
def Home(request):
name_input = request.POST.get('user_name')
name_in_model = Name(massenger_name=name_input,)
name_in_model.save()
return render(request , 'index.html')

而这 models.py:

from django.db import models
from datetime import datetime
# Create your models here.
class Name(models.Model):
massenger_name = models.CharField(max_length=50)
action_time = models.DateTimeField(default=datetime.now)
def __str__(self):
return self.massenger_name

而这个索引.html:

<!DOCTYPE html>
<html lang="en" dir="rtl">
<head>
<meta charset="utf-8">
<title></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
{% load static %}
<link rel="stylesheet" href="{% static 'CSS/style.css' %}">
</head>
<body>
<div id="form">
<form class="row" method="POST">
<div class="">
<input type="textarea" class="form-control" placeholder="أكتب أسمك (مثلا/أخوكم عبدالله العتيبي)" id="text_name" name="user_name">
</div>
<div class="col-auto">
<button type="submit" class="btn btn-primary mb-3" id="button">حمل الصورة</button>
</div>
</form>
</div>
</body>
</html>

您正在尝试创建一个没有messager_nameName行,这是使用CharField时默认为必填字段。您需要使此字段可为空:

massenger_name = models.CharField(max_length=50, null=True)

您需要makemigrationsmigrate才能应用更改。这将允许您拥有没有messager_nameName行。

请不要使用.get(…)[Django-doc],当缺少密钥时,它会使错误静音,这里就是这种情况。

您应该检查使用的方法,如果是 POST 请求,请正确处理它:

from django.shortcuts import redirect
from .models import Name
# Create your views here.
def Home(request):
ifrequest.method == 'POST':
Name.objects.create(massenger_name=request.POST['user_name'])
return redirect(Home)
return render(request , 'index.html')

在模型中,使用auto_now_add=True[Django-doc]作为action_time更有意义:

class Name(models.Model):
massenger_name = models.CharField(max_length=50)
action_time = models.DateTimeField(auto_now_add=True)
# …

注意:如果 POST 请求成功,您应该redirect[Django-doc]来实现Post/Redirect/Get模式[wiki]。这样可以避免在用户刷新 浏览器。


注意:函数通常是用snake_case编写的,而不是PascalCase,因此它是 建议将函数重命名为home,而不是Home