【问题标题】:DJANGO KeyError when using request.session with form.cleaned_data将 request.session 与 form.cleaned_data 一起使用时出现 DJANGO KeyError
【发布时间】:2018-07-24 19:14:52
【问题描述】:

我有 2 个视图功能。一个获取表单数据并(最好)将其存储在 request.session 中。第二个调用此数据并使用它在搜索查询中进行过滤。我还有 2 个与这些视图相对应的 html 模板。以下是观点

def searchpatients(request):
form = PatientSearchForm(request.POST or None)
if form.is_valid():
    request.session['fdata'] = form.cleaned_data['first_name']
    request.session['ldata'] = form.cleaned_data['last_name']
context = {
    'form_search' : form,
    }
return render(request, 'polls/search.html', context)

def displayed_try(request):
    fdata = request.session['fdata']
    ldata = request.session['ldata']
    results = Patients.objects.filter(
    first_name__icontains = 'fdata'
    ).filter(
    last_name__icontains = 'ldata'
    ).values_list('first_name', 'last_name', 'phone_number', 'status')
    context = {
    'results' : results
    }
    return render(request, 'polls/displayed.html', context)

在运行搜索功能时,我得到一个像这样的关键错误

KeyError at /displayed/

'fdata' 请求方法:POST 请求网址:http://localhost:8000/displayed/ Django 版本:2.0.6 异常类型:KeyError 异常值:
'fdata' 异常位置:getitem 中的 C:\Users\msengar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\contrib\sessions\backends\base.py 行55 Python 可执行文件:C:\Users\msengar\AppData\Local\Programs\Python\Python36-32\python.exe Python 版本:3.6.5

谁能指出我正确的方向?我不确定如何从 Django 中的表单(在不同的 HTML 模板上)获取数据,并使用该表单数据在另一个 HTML 页面上搜索和显示。作为参考,我的 2 个 html 页面是 search.html(包含搜索表单)和 display.html(在列表中显示过滤后的数据)。搜索页面按预期工作,但 display.html 页面要么总是给我一些 keyerror(使用会话存储时),要么显示一个没有数据的空表(仅使用表单操作时)。最后,这里是 display.html 代码。

{% block content %}
<div class = "shit">
<table class="table table-hover indexed table-dark">
  <thead>
    <tr>
      <th scope = "col"> "First Name" </th>
      <th scope = "col"> "Last Name" </th>
      <th scope = "col"> "Phone" </th>
      <th scope = "col"> "Status" </th>
    </tr>
    </thead>
  <tbody id = "rtable">
    {% for x in results %}
    <tr>
      {% for v in x %}
        <td> {{ v }} </td>
      {% endfor %}
    </tr>
    {% endfor %}
  </tbody>
</table>
</div>
{% endblock %}

编辑-这是 urls.py --

urlpatterns = [
path('admin/', admin.site.urls),
path('', home_try, name = 'homepage'),
path('signup/', signup_try.as_view(), name = 'signup'),
path('add/', addpatients, name = 'tryadding'),
path('profile/', profile_try, name = 'tryprofile'),
path('accounts/', include('django.contrib.auth.urls')),
path('information/', information_try, name = 'tryinformation'),
path('logout/', logout_try, name = 'tryloggingout'),
path('login/', auth_views.login, name = 'login'),
path('login_error/', login_error_handle, name = 'tryloginerror'),
path('change_password/', auth_views.password_reset, name = 'passwordchangetry'),
path('table_view/', table_try, name = 'try_table'),
path('search/', searchpatients, name = 'try_search'),
path('displayed/', displayed_try, name = 'try_displayed'),

这是 search.html 代码 --

<form method = "POST" action = "../displayed/" name = "pls">
<fieldset>
  <legend> Search Entry </legend>
  {% csrf_token %}
  {{ form_search.as_p }}
  <button type = "submit"> Search </button>
</fieldset>

谢谢大家,很抱歉这是多么混乱。请帮忙!

【问题讨论】:

    标签: python html django


    【解决方案1】:

    您正在将会话值存储到 fdata first_name__icontains = fdata 而不是 'fdata' 带引号

    另一个提示 - 使用 Q 连接查询。

    【讨论】:

    • 您好,感谢您的回答!我更改了这个引用错误,但它甚至看起来不像我的表单在我的搜索患者视图中验证。因此没有任何 request.session 数据被保存。为什么我的 form.is_valid 不成立?再次感谢!
    • 您可以检查 request.method == 'POST' 是否,然后检查表单是否有效。在发布请求并检查它是否有效之后放置一个检查点(打印一些东西)。还要确保您的操作 url 是正确的,并且您的表单方法是 post。为了让我了解错误在哪里,您能否附上 urls.py 和 html 表单代码?我认为问题就在那里。
    • 所以我做了 if request.method == POST: run program else: return to home page。每次我执行该函数时,它都会让我回到主页
    • 显然您的 Post 请求未显示。我仍然认为行动网址是罪魁祸首。您能否提供完整的 url 而不是 ... action = "../displayed/"
    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2018-12-01
    • 2015-08-06
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多