質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

468閲覧

Djangoで条件を入力してmodelのデータをエクセルへダウンロードしたい

rohizuka

総合スコア2

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/02/07 13:19

実現したいこと

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

こちらのサイトを参考にして解決しました。
https://qlitre-weblog.com/django-how-to-export-model/

投稿2023/02/15 00:17

rohizuka

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問