Django认证笔记项目中自动填充用户外键提示owner必填如何解决
问题原因
你的TaskForm默认将模型中的owner外键字段纳入了表单校验规则,提交表单时没有传递owner参数,会直接触发form.is_valid()校验失败,根本不会执行到后续给实例赋值owner的代码逻辑。
解决方案
修改你定义的TaskForm类,将owner字段排除出表单校验范围,有两种常用写法:
- 显式指定表单需要渲染、校验的字段(更推荐,可控性更高)
from django.forms import ModelForm from .models import Task class TaskForm(ModelForm): class Meta: model = Task # 只保留需要用户填写的字段 fields = ['title', 'completed']
- 直接排除不需要用户填写的
owner字段
from django.forms import ModelForm from .models import Task class TaskForm(ModelForm): class Meta: model = Task exclude = ['owner']
可选优化
建议你在视图中表单提交保存成功后增加重定向逻辑,避免用户刷新页面重复提交表单,修改后的视图代码如下:
from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from .models import Task from .forms import TaskForm @login_required(login_url='login') def index(request): tasks = Task.objects.filter(owner=request.user) form = TaskForm() if request.method=='POST': form = TaskForm(request.POST) if form.is_valid(): instance = form.save(commit=False) instance.owner = request.user instance.save() # 保存成功后重定向到当前页 return redirect('index') context = { 'tasks':tasks, 'form':form, } return render(request, 'list.html',context)
内容的提问来源于stack exchange,提问作者Behzod-UNB
相关产品推荐
相关产品推荐

