実現したいこと
Django初心者です。
テンプレートに検索キーワード入力し、Excelボタンを押下すると
modelのデータに合致したデータをエクセルへダウンロードするアプリを作成しています。
関連しそうなサイトを読み漁っていますが、なかなか意図する情報へたどり着けず
自己解決できず心折れ行き詰っています。
参考になるサイトやソースコードを教えて頂きたいです。
ヒントだけでも良いです!お助け下さい。。。
一部ソースコードを削除しましたが、
添付のソースコードでmodelからデータ取得し、一覧表示(確認用)はできています。
■困っている事
1.リセットボタンでテンプレートの値がクリアする方法が分からない
2.modelのデータに合致したデータをエクセルへダウンロードする方法が分からない
(検証用に準備した一覧表示は対応できている)
views.py
from django.shortcuts import render, redirect from django.views.generic import ListView, TemplateView from . import models from .models import TmSeihinSiyo from .forms import SearchForm from django.http import HttpResponse from django.db.models import Q class seiView(ListView): template_name = "appsei/download_sei.html" model = TmSeihinSiyo def post(self, request, *args, **kwargs): # リセットボタン押下 if "reset" in request.POST: context = super().get_context_data(**kwargs) seihin_cd = '' default_data = { 'seihin_cd': seihin_cd, 'tokui_cd' : '', } sei_form = SearchForm(initial=default_data) context['sei_form'] = sei_form return context # Excelボタン押下 elif "excel" in request.POST: title1 = request.POST["seihin_cd"] print("title1:",title1) title2 = self.request.POST.get('seihin_cd', None) print("title2:",title2) # 条件を受取する処理 form_value = [ self.request.POST.get('seihin_cd', None), self.request.POST.get('tokui_cd', None), ] request.session['form_value'] = form_value return self.get(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 前回の入力条件があったら画面へセット if 'form_value' in self.request.session: form_value = self.request.session['form_value'] seihin_cd = form_value[0] tokui_cd = form_value[1] default_data = {'seihin_cd': seihin_cd, 'tokui_cd' : tokui_cd, } sei_form = SearchForm(initial=default_data) context['sei_form'] = sei_form return context # session(検索画面)から取得した検索フォーム値でクエリ発行 def get_queryset(self): if 'form_value' in self.request.session: form_value = self.request.session['form_value'] seihin_cd = form_value[0] tokui_cd = form_value[1] # 検索条件 condition_seihin_cd = Q() condition_tokui_cd = Q() if len(seihin_cd) != 0 and seihin_cd[0]: condition_seihin_cd = Q(seihin_cd__istartswith=seihin_cd) if len(tokui_cd) != 0 and tokui_cd[0]: condition_tokui_cd = Q(tokui_cd=tokui_cd) # 必要な情報をフィルターする return TmSeihinSiyo.objects.select_related().filter(condition_seihin_cd & condition_tokui_cd) else: # 何も返さない return TmSeihinSiyo.objects.none()
forms.py
from django import forms class SearchForm(forms.Form): seihin_cd = forms.CharField( initial='', label='製品', widget=forms.TextInput(attrs={'placeholder':'製品'}), max_length=15, required = False # 必須ではない ) tokui_cd = forms.CharField( initial='', label='得意先', widget=forms.TextInput(attrs={'placeholder':'得意先'}), max_length=5, required = False # 必須ではない ) widget_textinput = forms.TextInput( attrs={ "class":"form-control" } )
download_sei.html
{% load static %} {% load widget_tweaks %} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'> <title>情報検索</title> <link rel="stylesheet" href="{% static 'f_sei.css' %}"> </head> <body class="body"> <div class="container"> <div class="text-center"> <h1>製品情報 検索メニュー</h1> <h3>条件を入力してエクセルボタン<br class="d-lg-none">を押して下さい!<h3> </div> <form class="main" action="" method="POST"> {% csrf_token %} <div class="container"> <div class="row g-3"> <div class="col-lg-3"> {{ sei_form.seihin_cd | add_class:"form-control w-50" }} </div> <div class="col-lg-3"> {{ sei_form.tokui_cd | add_class:"form-control w-50" }} </div> <div class="col-lg-3"> </div> <div class="col-lg-3"> </div> </div> </div> <div class="row g-3"> <div class="col-lg-3 text-center"> <input class="button" type="submit" name="reset" value="リセット" > </div> <div class="col-lg-3 text-center"> <input class="button" type="submit" name="excel" value="エクセル" > </div> <div class="col-lg-3 text-center"> <!-- blank --> </div> <div class="col-lg-3 text-center"> <a class="button" href="/" target="_self">戻る</a> </div> </div> </form> <div class="row justify-content-center"> <div style="height:450px; width:1000px; overflow-y:scroll;"> {% if object_list|length == 0 %} <p>検索結果が存在しません。</p> {% else %} <table class="table table-striped table-hover table_view" width="800"> <tr> <th>製品</th> <th>得意先</th> </tr> <tbody> {% for post in object_list %} <tr> <td>{{ post.seihin_cd }}</td> <td>{{ post.tokui_cd }}</td> </tr> {% endfor %} </tbody> </table> {% endif %} </div> </div> <footer class="footer"> </footer> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script> </div> </body> </html>
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。