如何解决Django报错:ProjectDetailsAdmin.projekt必须是Projekt实例
问题原因
报错核心是 ProjectDetailsAdmin 模型里的projekt是外键字段,必须接收Projekt类的实例对象,你当前从POST请求中拿到的projekt是字符串类型的项目ID,直接赋值就触发了类型不匹配错误。
修复步骤
第一步:修正视图POST逻辑
首先你需要把拿到的字符串ID转换为Projekt实例,同时修复原代码里参数间缺少逗号的语法错误,修改后的代码如下:if request.method == 'POST': projekt_id = request.POST.get('projekt') projekt = None if projekt_id: try: projekt = Projekt.objects.get(id=projekt_id) except Projekt.DoesNotExist: # 可自行补充项目ID不存在的错误处理逻辑 pass projekt_name = request.POST.get('projekt_name') r01 = request.POST.get('r01') szervkult_adm = ProjectDetailsAdmin(projekt=projekt, projekt_name=projekt_name, r01=r01) szervkult_adm.save()如果你不想额外查一次数据库,也可以用外键的
_id后缀直接赋值ID,写法如下:szervkult_adm = ProjectDetailsAdmin(projekt_id=projekt_id, projekt_name=projekt_name, r01=r01)第二步:优化下拉框HTML代码
原下拉框没有显式设置value属性,且仅展示ID用户无法区分项目,修改为:<div class="container bg-warning my-3">Válaszd ki projektet: <select class="form-select" id="projekt" name="projekt" aria-label=""> {% for i in allprojects %} <option value="{{ i.id }}">{{ i.projekt }}</option> {% endfor %} </select> </div>
其他可优化点
- 视图里的RawQuerySet写法可以替换为普通ORM查询,性能和可读性更好
- POST提交保存成功后建议返回重定向响应,避免用户刷新页面重复提交表单
- 可以加表单校验逻辑,避免参数缺失或格式错误触发异常
内容的提问来源于stack exchange,提问作者RlM
相关产品推荐
相关产品推荐

