Django视图传参异常:州人口数据页面无法获取参数求助
我是编程/Django新手,若该问题已有解答在此致歉,我已在StackOverflow搜索但未找到合适答案。
我正在开发一个Django应用,允许用户通过唯一标识符(我的Django模型中称为APN)搜索房产记录,同时提供该房产所在州的人口数据(如加利福尼亚州、佛罗里达州等)。用户提交APN搜索查询后,应用会生成显示地址、城市和州的页面,州字段需链接到显示对应州级人口数据的独立页面。例如,若房产所在州为“Colorado”,用户点击链接应跳转到显示科罗拉多州人口数据的页面。
模型代码
class AnnualPopulation(models.Model): State = models.CharField(max_length=2, blank=True, null=True) Population_2022 = models.IntegerField(blank=True, null=True) Population_2023 = models.IntegerField(blank=True, null=True) class PropDots2(models.Model): APN = models.CharField(max_length=250, blank=True) Address = models.CharField(max_length=250, blank=True) City = models.CharField(max_length=250, blank=True) State = models.CharField(max_length=250, blank=True)
表单代码
class PropSearchForm2(forms.Form): APN = forms.CharField(required=True, label='APN')
视图代码
# 按APN搜索房产记录 class PropDetailSearch(FormView): template_name = 'search/propdetailsearch2.html' form_class = PropSearchForm2 success_url = 'search/propdetailview2.html' # 返回指定房产记录的地址、城市和州并在新页面显示 class PropDetailView2(ListView): model = PropDots2 template_name = 'search/propdetail2.html' def get_queryset(self): query = self.request.GET.get('APN') object_list = PropDots2.objects.filter(APN__icontains=query) return object_list # 返回指定州的人口数据并在新页面显示 class StatePopulationView(ListView): model = AnnualPopulation template_name = 'search/populationresult.html' def get_queryset(self): querystate = self.request.GET.get('State') object_list = AnnualPopulation.objects.filter(Q(State__icontains=querystate)) return object_list
模板代码
搜索表单模板(propdetailsearch2.html)
{% block content %} <h1>Enter Search Criteria</h1> <form action="{% url 'propdetail2' %}" method="get"> {% csrf_token %} {{ form|crispy }} <input class="btn btn-primary" name="q" type="submit" placeholder="Search"> </form> {% endblock content %}
房产详情模板(propdetail2.html)
{% block content %} {% for PropDots2 in object_list %} <h2><a href="{% url 'populationresult' PropDots2.State %}">{{ PropDots2.Address }} {{ PropDots2.City }}</a></h2> {% endfor %} {% endblock content %}
州人口数据模板(populationresult.html)
{% block content %} {% for AnnualPopulation in object_list %} <h4>{{ AnnualPopulation.Population_2022 }} {{ AnnualPopulation.Population_2023 }}</h4> {% endfor %} {% endblock content %}
URL配置
urlpatterns = [ path('populationresult/<str:State>/', StatePopulationView.as_view(), name='populationresult'), path('propdetailsearch2/', PropDetailSearch.as_view(), name='propdetailsearch2'), path('propdetail2/', PropDetailView2.as_view(), name='propdetail2'), ]
问题现象
除州人口页面外,其余功能均正常。点击房产的州链接时,应用生成的URL正确(例如http://127.0.0.1:8000/populationresult/CA/),但未显示人口数据页面,而是报错:
ValueError at /populationresult/CA/
Cannot use None as a query value
显然州值未传递到StatePopulationView视图,恳请提供帮助,再次致歉若该问题已有解答。
问题原因及修复方案
问题原因
URL中通过路径参数传递了州代码(如CA),但StatePopulationView的get_queryset方法错误地从request.GET(URL查询参数,格式为?State=CA)中获取值,导致querystate为None,触发查询错误。
修复步骤
修改视图获取参数的方式
在StatePopulationView中,从self.kwargs中读取URL路径参数,而非request.GET:def get_queryset(self): # 从URL路径参数中获取State值 querystate = self.kwargs.get('State') object_list = AnnualPopulation.objects.filter(State__icontains=querystate) return object_list注:此处无需使用
Q对象,直接过滤即可。可选优化:统一州字段长度
AnnualPopulation的State字段长度为2(符合州代码规范),但PropDots2的State字段长度为250,建议统一为2,保证数据一致性:class PropDots2(models.Model): # ...其他字段 State = models.CharField(max_length=2, blank=True)数据一致性检查
确保PropDots2.State存储的是两位州代码(如CA),与AnnualPopulation中的数据格式匹配,避免因格式不一致导致查询无结果。
内容的提问来源于stack exchange,提问作者pklr35

