【问题标题】:Generate full pdf report based on the search term used for a simple search根据用于简单搜索的搜索词生成完整的 pdf 报告
【发布时间】:2017-06-05 20:41:58
【问题描述】:

我在我的 Django 应用程序中有一个“简单”搜索,它会生成数据库中所有匹配项的列表,与搜索词匹配。我希望用户能够单击一个按钮,该按钮将生成一个 pdf 报告,其中包含简单搜索中列出的命中的所有信息。因此,我想知道是否可以“存储”搜索生成的查询集并将其传递给链接到“生成 PDF 报告”按钮的函数。

当前 search.html 模板:

{% extends 'base.html' %}
{% block body %}

{% if enzyme_list %}
    <h1>Search Results (matching enzyme terms):</h1>
    <ul>
        {% for enzyme in enzyme_list %}
            <li><a href="{% url 'gts:detail' enzyme.id %}">{{ enzyme.barcode }}, {{ enzyme.enzyme_name }}</a></li>
        {% endfor %}
    </ul>
    <div>
        <a href="{% url 'gts:pdf_report' %}" class="btn btn-primary">Generate PDF report (WORK IN PROGRESS)</a>
    </div>
{% else %}
    <h1>No enzyme(s) found matching the specified search term.</h1>
{% endif %}

{% endblock %}

views.py(显示两个相关视图)

# The view that is used to generate the initial simplified list (template shown above)
class EnzymeList(generic.ListView):
    context_object_name = 'enzyme_list'
    template_name = 'gts/search.html'

    def get_queryset(self):
        query = self.request.GET.get("q")
        #queryset_list = Enzymes.objects.filter(barcode='Tt_86')
        queryset_list = Enzymes.objects.filter(Q(barcode__icontains=query) |
        Q(enzyme_name__icontains=query) | Q(ec_number__icontains=query) | Q(enzyme_activity__icontains=query) |
        Q(organism__icontains=query) | Q(genbank_number__icontains=query) | Q(uniprot_accession__icontains=query) |
        Q(description_of_activity__icontains=query) | Q(experiment_details__icontains=query)
        )
        return queryset_list

# The view that is linked to the PDF generation (just the 'framework' for now).
def ReportView(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    # Create the PDF object, using the response object as its "file."
    p = canvas.Canvas(response)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()
    return response

将url与函数匹配的urls.py

app_name = 'gts'
urlpatterns = [
    url(r'^get_result/$', views.EnzymeList.as_view(), name='enzyme_list'),
    url(r'^pdf_report/$', views.ReportView, name='pdf_report'),
]

我希望我能够在模板中结合&lt;a href="{% url 'gts:pdf_report' enzyme_list %}" class="btn btn-primary"&gt; 与新函数头def ReportView(request, data): 之类的操作,但这抱怨缺少反向匹配。

-- 潜在修复--

我找到了一种让它工作的方法,但我很确定这不是正确的“Django”,我刚刚将查询添加到返回中。因此,我可以将其发送回 pdf 生成。 '蹩脚'的解决方案如下:

views.py

class EnzymeList(generic.ListView):
    context_object_name = 'enzyme_list'
    template_name = 'gts/search.html'

    def get_queryset(self):
        query = self.request.GET.get("q")
        #queryset_list = Enzymes.objects.filter(barcode='Tt_86')
        queryset_list = Enzymes.objects.filter(Q(barcode__icontains=query) |
        Q(enzyme_name__icontains=query) | Q(ec_number__icontains=query) | Q(enzyme_activity__icontains=query) |
        Q(organism__icontains=query) | Q(genbank_number__icontains=query) | Q(uniprot_accession__icontains=query) |
        Q(description_of_activity__icontains=query) | Q(experiment_details__icontains=query)
        )
        return (query, queryset_list)

搜索.html

{% extends 'base.html' %}
{% block body %}

{% if enzyme_list %}
    <h1>Search Results (matching enzyme term: "{{ enzyme_list.0 }}"):</h1>
    <ul>
        {% for enzyme in enzyme_list.1 %}
            <li><a href="{% url 'gts:detail' enzyme.id %}">{{ enzyme.barcode }}, {{ enzyme.enzyme_name }}</a></li>
        {% endfor %}
    </ul>
    <div>
        <a href="{% url 'gts:pdf_report' %}?q={{enzyme_list.0}}" class="btn btn-primary">Generate PDF report (WORK IN PROGRESS)</a>
    </div>
{% else %}
    <h1>No enzyme(s) found matching the specified search term: "{{ enzyme_list.0 }}".</h1>
{% endif %}

{% endblock %

}

-- TL:DR--

然后具体的问题是如何将搜索词交给ReportView 函数,假设我的“修复”不是 Django 式的。

【问题讨论】:

    标签: django reportlab


    【解决方案1】:

    为什么不将查询移到其他函数并在需要时调用它。

    def enzyme_search(query):
        return Enzymes.objects.filter(Q(barcode__icontains=query) |
            Q(enzyme_name__icontains=query) | Q(ec_number__icontains=query) | Q(enzyme_activity__icontains=query) |
            Q(organism__icontains=query) | Q(genbank_number__icontains=query) | Q(uniprot_accession__icontains=query) |
            Q(description_of_activity__icontains=query) | Q(experiment_details__icontains=query)
        )
    

    然后在EnzymeList类中,

    ...
    def get_queryset(self):
        query = self.request.GET.get("q")
        return enzyme_search(query)
    
    def get_context_data(self):
        context = super(EnzymeList, self).get_context_data(**kwargs)
        context['query'] = self.request.GET.get("q")
        return context
    ...
    

    ReportView

    ...
    query = self.request.GET.get("q")
    enzyme_list = enzyme_search(query)
    ...
    

    然后在你的锚标签中有

    <a href="{% url 'gts:pdf_report' %}?q={{ query }}" class="btn btn-primary">
    

    这应该可以帮助您将查询转移到ReportView

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2016-05-30
      • 2020-07-19
      • 1970-01-01
      • 2014-11-02
      • 2015-04-04
      • 2019-04-11
      相关资源
      最近更新 更多