2017-05-26 12 views
0

Djangoアプリケーションで、検索用語に一致するデータベースからのすべてのヒットのリストを生成する「単純な」検索があります。私は、ユーザーが簡単な検索に記載されているヒットのすべての情報を含むPDFレポートを生成するボタンをクリックできるようにしたい。したがって、検索で生成されたクエリーセットを「保存」し、「Generate PDF report」ボタンにリンクされている関数に渡すことが可能かどうかは疑問でした。単純な検索に使用された検索語に基づいて完全な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 

app_name = 'gts' 
urlpatterns = [ 
    url(r'^get_result/$', views.EnzymeList.as_view(), name='enzyme_list'), 
    url(r'^pdf_report/$', views.ReportView, name='pdf_report'), 
] 
関数にURLと一致urls.py

私は<a href="{% url 'gts:pdf_report' enzyme_list %}" class="btn btn-primary">のような機能を新しい機能と組み合わせることができると思いましたテンプレート内にdef ReportView(request, data):というヘッドがありますが、これはリバースマッチが欠落していると不平を言っています。

- 潜在的な修正 -

私はそれが動作を取得する方法を見つけたが、私は、これは「ジャンゴ」正しくないことを、むしろ確信しています、私はリターンにクエリを追加しました。それで、私はそれを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) 

search.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 -

質問は、具体的にどのように検索用語は、私の 'fix'がDjango-esqueではないと仮定して、ReportView関数に与えられました。

答えて

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"> 

を持っている。これは、あなたがTRAN役立つはずですクエリをReportViewに送ります。

関連する問題