Django表单提交查询Dinucleotides出现DoesNotExist错误求助
问题分析
你遇到的DoesNotExist错误有两个核心原因:
- 查询值硬编码错误:你在查询时写死了
SSRtype='Motiff',这意味着不管用户提交什么内容,程序都会去查找SSRtype等于字符串'Motiff'的记录,而不是用户输入的实际值。正确的做法应该是用表单提交的Motiff参数值作为查询条件。 - 未处理查询无结果的情况:
get()方法在数据库中找不到匹配记录时会直接抛出DoesNotExist异常,必须提前处理这种场景,避免程序崩溃。
修正方案
针对这两个问题,你可以做以下调整:
- 替换硬编码的查询值,使用用户提交的表单数据
request.POST.get('Motiff')(用get()可以避免键不存在时抛出KeyError) - 用两种方式处理无结果的情况:
方式一:使用filter()替代get(),然后判断结果是否存在
方式二:保留get(),但用try-except捕获DoesNotExist异常
修正后的views.py代码
from django.shortcuts import render from django.views.generic import TemplateView, ListView, DetailView from ssr.models import Dinucleotides from ssr.forms import InputForm from django.core.exceptions import DoesNotExist # 导入异常类 # Create your views here. def homepage(request): return render(request,'index.html') def searchpage(request): if request.method == 'GET': form = InputForm() return render(request,'search.html',{'form':form}) else: print(request.POST) motiff_value = request.POST.get('Motiff') # 获取用户提交的实际值 if motiff_value: # 方式一:用filter处理无结果情况 obj_list = Dinucleotides.objects.filter(SSRtype=motiff_value) if obj_list.exists(): obj1 = obj_list.first() return render(request,'result.html',{'obj1':obj1}) else: # 无匹配记录时返回提示 return render(request,'search.html',{'form':InputForm(), 'error': '未找到匹配的记录'}) # 方式二:用try-except捕获异常(二选一即可) # try: # obj1 = Dinucleotides.objects.get(SSRtype=motiff_value) # return render(request,'result.html',{'obj1':obj1}) # except DoesNotExist: # return render(request,'search.html',{'form':InputForm(), 'error': '未找到匹配的记录'}) else: # 处理用户未输入Motiff的情况 return render(request,'search.html',{'form':InputForm(), 'error': '请输入Motiff内容'})
额外建议
- 建议使用Django表单的
cleaned_data来获取用户输入,而不是直接访问request.POST,这样可以利用表单的验证功能,比如:form = InputForm(request.POST) if form.is_valid(): motiff_value = form.cleaned_data.get('Motiff') # 后续查询逻辑 - 在模板中可以添加错误提示的展示,比如在
search.html中:{% if error %} <p style="color:red;">{{ error }}</p> {% endif %}
内容的提问来源于stack exchange,提问作者tamannasharma
相关产品推荐
相关产品推荐

