如何将搜索选项传递给url

问题描述 投票:0回答:1

目前我有一个搜索返回与输入匹配的模型。我的目标是在此搜索中添加一个下拉列表并将其传递到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>

我需要我的网址看起来像这样

URLs.朋友

app_name = 'app'
urlpatterns = [
        path('login/index/', views.IndexView.as_view()),
        path('login/index/<category option here>/search', views.SearchView.as_view(), name="search"),
        path('login/index/<category option here>/<slug:key>', views.ModelView.as_view(), name="detail"),  
    ]

我能够抓住key并将其推送到搜索结果页面上的网址,没有这样的问题

search.html

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

并且能够通过在我的视图中使用像这样的get函数来获取密钥

def get(self, request, *args, **kwargs):
    self.q = self.kwargs['key']
    return super().get(request, *args, **kwargs)

但由于类别不是这个模型的模式的一部分,我不能使用相同的方法(这是一个复杂的原因,为什么它不是)

总体

我需要将从IndexView中选择的类别选项继续进入ModelView,并能够在我的模板中使用它来创建不同的页面,如下所示,并希望在我的视图中使用GET函数来访问类别并返回上下文给了我这个类别

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

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

编辑:views.py

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
python django
1个回答
1
投票

如果你想在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>

像这样调整你的网址:

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"),  
]

现在,您可以通过ModelViel访问self.kwargs中的类别:

class ModelView(...):
    @property
    def searched_category(self):
        return self.kwargs.get('searched_category')

    # use it in any view method with 'self.searched_category'
© www.soinside.com 2019 - 2024. All rights reserved.