Python 如何将选项从搜索传递到url

Python 如何将选项从搜索传递到url,python,django,Python,Django,目前我有一个搜索,返回与输入匹配的模型。我的目标是在这个搜索中添加一个下拉列表,并将其传递到url中,以便在一个模板中使用单独的视图 所以我的搜索表单应该是这样的 index.html <form method="GET" action = "{% url 'app:search' %}"> <input name="q" type="text" placeholder="search by Key or Name"/> <select name = "cat

目前我有一个搜索,返回与输入匹配的模型。我的目标是在这个搜索中添加一个下拉列表,并将其传递到url中,以便在一个模板中使用单独的视图

所以我的搜索表单应该是这样的

index.html

<form method="GET" action = "{% url 'app:search' %}">
 <input  name="q" type="text" placeholder="search by Key or Name"/>
 <select name = "category">
     <option value = "1"> Category 1</option>
     <option value = "2"> Category 2</option>
     <option value = "all"> All</option>
 </select>
  <input  type="submit" value="Search"/>
    </form>
并且能够通过在我的视图中使用像这样的get函数来获取密钥

def get(self, request, *args, **kwargs):
    self.q = self.kwargs['key']
    return super().get(request, *args, **kwargs)
但是,由于类别不是这个模型模式的一部分,我不能使用同样的方法。为什么它不是呢?有一个复杂的原因

总体上

我需要在ModelView中继续从IndexView中选择category选项,并且能够在我的模板中使用该选项来创建不同的页面,就像我下面所做的那样,并且希望在我的视图中使用GET函数来访问类别并返回给我类别的上下文

<% if category == "1" %>
   <h1> CATEGORY 1 </h1>

<% elseif category == "2" %>
   <h2> CATEGORY 2 </h1>

如果希望在ModelView中提供搜索的类别,这将是实现以下目标的一种方法:

通过将搜索的类别也传递到上下文中来扩展SearchView:

class SearchView(LoginRequiredMixin, TemplateView):
    # ...

    def get_context_data(self, **kwargs):
        context = super(SearchView, self).get_context_data(**kwargs)
        context['results'] = self.results
        context['searched_category'] = self.request.GET.get('q')
        return context
然后,您可以在search.html中将其编码到url中:

<ul>
    {% for x in results %}
        <li><a href = "{% url 'app:detail' searched_category x.key %}">{{x.name}}</a></li>
    {% endfor %}
</ul>

你不使用django forms和a的原因是什么?类别是否在某个地方硬编码?我确实意识到我应该使用django forms/formsview,我计划改用它,但就短期而言,如果可能的话,我会坚持这一点……而且这些类别是在表单选项之外的索引页上硬编码的。事实上,我不明白为什么这些类别需要搜索,而它们是硬编码的。而不是一个表单,这些可能只是url已经包含该类别的链接。不幸的是,更难理解实际问题:。SearchView应该如何处理所选类别?确实要使用url中的类别重定向到某个地方吗?您可以添加SearchView的代码吗?我想过这样做,但不知道如何将类别传递到表单action{%url'kpi:search'%}@Mfreeman中。我不完全理解您首先要实现的目标。如果您已经知道所有类别,为什么这些选项都是表单中的,而不是简单地链接到正在生成url的视图?只有在存在实际动态生成的条目时,搜索才有意义。因此,我的视图不是detailviews,原因是,我必须为多个模型创建查询集,并且我返回的上下文是大量查询集……考虑到这一点,我不必为每个类别创建搜索视图和显示视图,其中包含重新生成的上下文,如果我做到了这一点,我就能够在这个特定的模型上保留一个用于搜索和显示的视图
class SearchView(LoginRequiredMixin, TemplateView):
    template_name = 'app/search.html'

    def get(self, request, *args, **kwargs):
        q = request.GET.get('q','')
        for term in list(set(q.split())):
            self.results = Model1.objects.filter(Q(name__icontains= term) | Q(key__icontains=term))
        return super().get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(SearchView, self).get_context_data(**kwargs)
        context['results'] = self.results
        return context
class SearchView(LoginRequiredMixin, TemplateView):
    # ...

    def get_context_data(self, **kwargs):
        context = super(SearchView, self).get_context_data(**kwargs)
        context['results'] = self.results
        context['searched_category'] = self.request.GET.get('q')
        return context
<ul>
    {% for x in results %}
        <li><a href = "{% url 'app:detail' searched_category x.key %}">{{x.name}}</a></li>
    {% endfor %}
</ul>
app_name = 'app'
urlpatterns = [
    path('login/index/', views.IndexView.as_view()),
    path('login/index/search', views.SearchView.as_view(), name="search"),
    path('login/index/<str:searched_category>/<slug:key>', views.ModelView.as_view(), name="detail"),  
]
class ModelView(...):
    @property
    def searched_category(self):
        return self.kwargs.get('searched_category')

    # use it in any view method with 'self.searched_category'