我正在列出与我的模型的name
参数匹配的搜索结果中的数据。对于每个结果,我都有一个指向详细信息页面的链接,该链接带有在URL中传递的key
参数(这是一个字符串),就像这样
<ul>
{% for x in results %}
<li><a href = 'login/index/{{x.key}}'>{{x.name}}</a></li>
{% endfor %}
</ul>
我的url.py看起来像这样
app_name = 'kpi'
urlpatterns = [
path('login/index/search', views.SearchView.as_view(), name="search"),
path('login/index/<slug:key>', views.EpicDetailView.as_view(), name="detail")
]
我的views.py看起来像这样:
class SearchView(LoginRequiredMixin, TemplateView):
template_name = 'KPI/search.html'
def get(self, request, *args, **kwargs):
self.q = request.GET.get('q','')
self.results = Epic.objects.filter(name__icontains= self.q)
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 EpicDetailView(LoginRequiredMixin, TemplateView):
template_name = 'KPI/epic_detail.html'
def get_context_data(self, **kwargs):
context = super(EpicDetailView, self).get_context_data(**kwargs)
context['lone_epic2'] = Epic.objects.get(key=self.kwargs['key'])
我知道我在这里缺少步骤,可能是我如何创建url路径,或者在我的视图中需要逻辑。使用上面的代码,我得到一个page not found
错误,因为模板视图链接无法重新识别/匹配EpicDetailView网址
我要实现的目标
目的是能够单击搜索结果,将key
推送到url,并将该key
值存储为变量,以在EpicDetailView页面中使用
注意:尽管我没有在上面的代码中显示它,但是我的详细信息视图将显示来自多个模型查询集的数据,因此这就是为什么我为EpicDetailView
使用TemplateView而不是DetailView
答案 0 :(得分:1)
您应该像在模板中那样将子弹传递到URL中:
<li><a href = "{% url 'kpi:detail' x.key %}">{{x.name}}</a></li>
确保kpi
已正确注册为KPI应用程序的名称空间。有关URL调度程序的更多信息,请点击此处:https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#url