将参数传递给 Django 中的 ListView

Posted

技术标签:

【中文标题】将参数传递给 Django 中的 ListView【英文标题】:Passing a parameter to a ListView in Django 【发布时间】:2018-01-13 17:11:51 【问题描述】:

我有一个带有某些值的 html 下拉列表,我想将这些值传递给我的通用视图,以便返回过滤后的列表。

班级:

class filteredListView(generic.ListView):
    template_name = 'guestlist/guestlist.html'

    def get_queryset(self, **kwargs):
        relation = kwargs.get('relation', None)
        if relation == 'all':
            return Guest.objects.all()
        if relation == 'grooms_side':
            return Guest.objects.filter(grooms_side=True)
        if relation == 'brides_side':
            return Guest.objects.filter(brides_side=True)
        if relation == 'friends':
            return Guest.objects.filter(friends=True)

html 块:

<th colspan="4">
  <label>Filter by Relation
    <select onchange="location='filtered'">
      <option value="all">All</option>
      <option value="grooms_side">Groom's Side</option>
      <option value="brides_side">Brides's Side</option>
      <option value="friends">Friends</option>
    </select>
  </label>
</th>

我尝试像常规视图一样使用普通的 href 传递值,但这给了我一个 NoReverseMatch 异常。

urls.py:

from django.conf.urls import url
from . import views

app_name = 'guestlist'

urlpatterns = [

    # /guestlist/
    url(r'^$', views.indexView.as_view(), name='index'),
    # /guestlist/
    url(r'^guestlist/$', views.guestListView.as_view(), name='guestlist'),
    # /guestlist/add
    url(r'^guestlist/add/$', views.guestCreate.as_view(), name='add'),
    # /guestlist/filtered
    url(r'^guestlist/filtered$', views.filteredListView.as_view(), 'relation': 'relation', name='filtered'),

]

我的问题是如何将下拉列表选项中的值传递给视图。 谢谢。

编辑:我根据其中一个答案更改了一些内容,但问题仍然存在。我应该在urls.py 的字典中输入什么来传递值?

【问题讨论】:

参见文档中的here 另外,这个answer 另外,这个例子展示了如何传递一个硬编码的字符串,我希望传递一个变量。 @ChihebNexus 问题已根据您的回答进行了编辑,所以感谢您让我更接近解决方案!仍在尝试将变量而不是硬编码的字符串传递给字典。 【参考方案1】:

您需要使用表单将下拉列表中的值发送到过滤器视图。而且没有理由在 URL 模式本身中添加任何内容。

url(r'^guestlist/filtered$', views.filteredListView.as_view(), name='filtered'),


<th colspan="4">
  <form action="% url filtered %" method="GET">
  <label>Filter by Relation
    <select name="relation">
      <option value="all">All</option>
      <option value="grooms_side">Groom's Side</option>
      <option value="brides_side">Brides's Side</option>
      <option value="friends">Friends</option>
    </select>
  </label>
  <input type="submit" value="Filter">
  </form>
</th>

在视图中:

def get_queryset(self, **kwargs):
    relation = self.request.GET.get('relation', None)
    ...

【讨论】:

但是如何在视图中使用它呢?我需要定义某个字段以从 html 中获取值吗? 是否可以用列表视图实现post请求

以上是关于将参数传递给 Django 中的 ListView的主要内容,如果未能解决你的问题,请参考以下文章

django 将参数传递给模板标签中的函数

将命名参数传递给 Django 模板中的函数

将参数传递给FormView Django中的表单

如何将从表单提交中检索到的参数作为参数传递给 django 中的函数

将 url 参数传递给 ListView 查询集

如何正确地将参数传递给 Django 中的基于类的视图实例?