You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django视图传参异常:州人口数据页面无法获取参数求助

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,触发查询错误。

修复步骤

  1. 修改视图获取参数的方式
    在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对象,直接过滤即可。

  2. 可选优化:统一州字段长度
    AnnualPopulation的State字段长度为2(符合州代码规范),但PropDots2的State字段长度为250,建议统一为2,保证数据一致性:

    class PropDots2(models.Model):
        # ...其他字段
        State = models.CharField(max_length=2, blank=True)
    
  3. 数据一致性检查
    确保PropDots2.State存储的是两位州代码(如CA),与AnnualPopulation中的数据格式匹配,避免因格式不一致导致查询无结果。

内容的提问来源于stack exchange,提问作者pklr35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:06:08