当前,我正在搜索返回与输入匹配的模型。我的目标是为该搜索添加一个下拉列表,并将其传递到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.py
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中选择的category选项继续到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
答案 0 :(得分: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'