使用TemplateView将模型的字符串参数传递给URL

时间:2019-02-26 20:19:06

标签: python django

我正在列出与我的模型的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

1 个答案:

答案 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