Django禁止空输入入库及Admin页数据、日期字段不显示问题排查
问题1:表单提交空值直接入库修复
问题原因
当前视图逻辑接收到POST请求后,未对user_name参数做任何非空校验,直接调用create方法写入数据库;同时模型层的字符字段未做非空约束,空字符串符合CharField的默认存储规则,因此空值会直接落库。
另外注意到模型字段存在拼写误差:massenger_name为拼写错误,标准写法应为passenger_name,可按需调整。
修复方案
- 第一层:视图层增加非空校验
取POST参数时优先用get方法避免KeyError,拿到参数后先去除首尾空格,判断为空则直接返回错误提示,不执行入库操作。
修复后的views.py代码:from django.shortcuts import render, redirect from .models import Name from django.contrib import messages def Home(request): if request.method == 'POST': # 取参数默认空字符串,同时去除首尾空格拦截全空格输入 user_name = request.POST.get('user_name', '').strip() if not user_name: messages.error(request, '用户名不能为空') return redirect(Home) Name.objects.create(massenger_name=user_name) return redirect(Home) return render(request, 'index.html') - 第二层:模型层增加非空约束
给字符字段加上非空限制,从数据库层面兜底拦截空值。注意CharField类型不要设置null=True,空值统一用空字符串管控即可。
调整后的models.py对应字段:
改完模型记得依次执行class Name(models.Model): # 增加blank=False约束,禁止表单/接口提交空值 massenger_name = models.CharField(max_length=50, blank=False) # auto_now_add字段会自动填充创建时间,不需要额外加null、blank参数 action_time = models.DateTimeField(auto_now_add=True) def __str__(self): return str(self.massenger_name)python manage.py makemigrations和python manage.py migrate同步数据库结构。
问题2:Admin后台不显示DateTimeField字段修复
问题原因
Django Admin默认不会自动展示带auto_now_add/auto_now属性的时间字段,这类字段属于自动填充的只读字段,需要手动在Admin注册类里配置到展示列表、只读字段列表中,否则后台不会渲染该字段内容。
修复方案
在对应app的admin.py中注册模型时,显式配置要展示的字段,把时间字段加入只读字段列表。如果app下没有admin.py,直接新建即可,参考代码:
from django.contrib import admin from .models import Name class NameAdmin(admin.ModelAdmin): # 列表页展示的字段 list_display = ('massenger_name', 'action_time') # 编辑页展示的字段 fields = ('massenger_name', 'action_time') # 自动填充的时间字段设为只读,避免编辑页报错 readonly_fields = ('action_time',) admin.site.register(Name, NameAdmin)
配置完成后重启Django服务,进入Admin后台即可看到时间字段正常显示。
内容的提问来源于stack exchange,提问作者data data
相关产品推荐
相关产品推荐

