前提
Pythonとdjangoの初心者です。Javaはそこそこ理解しています。
Twitterから投稿内容を取得して二次元配列にし、csv出力するアプリをdjangoで作成しております。
以下にコードを載せますが、
views.pyの中のget関数で処理して取得してきた2次元配列を同一クラス内の別関数、csv_export関数でクラスオブジェクトに持たせた2次元配列データをresponseオブジェクトに変換して返却する機能を実装中に、以下のエラーメッセージが発生しました。
エラー発生タイミングは、ツイートを取得して、results.htmlのページが出たときにCSVダウンロードボタンを押下したタイミングです。
実現したいこと
・results.htmlの中のcsv出力ボタンを押下したときにcsvをダウンロードさせたい
試したこと
views.pyの中の、
■■■■ ■■■■ で囲んだ部分でセッター、ゲッターを置いて処理できないかと試していましたが
うまくいきませんでした。
発生している問題・エラーメッセージ
TypeError at /csv/ csv_export() missing 1 required positional argument: 'self'
該当のソースコード
twittersearch/urls.py
from django.contrib import admin from django.urls import path,include from .views import helloworldfunc urlpatterns = [ path('admin/', admin.site.urls), path('', include("search.urls"),name="search"), ]
twittersearch/search/urls.py
from django.urls import path from . import views app_name = "search" urlpatterns = [ path('csv/', views.SearchView.csv_export,), path('', views.index, name="index"), ]
twittersearch/search/views.py
import csv import os from django.http import HttpResponse from django.shortcuts import render from django.views import generic from django.views import View from . import scraping import time import pandas as pd #Viewを継承してGET文、POST文の関数を作る class SearchView(View): def __init__(self): self:list = None def get_list(self): return self.__list def set_list(self, list): self.__list = list def csv_export(request, self): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="result.csv"' writer = csv.writer(response) # ■■■■ここにget関数でセットしたcsv用の配列をresponseオブジェクトに書き込みたい■■■■ for tweets in this.get_list(self): writer.writerow(tweets) return response def get(self, request, *args, **kwargs): if "search_word" in request.GET: print(request) if request.GET["search_word"] != "": start_date = request.GET["start_date"] end_date = request.GET["end_date"] # search_limit = 100 # if request.GET["search_limit"] != "": # search_limit = request.GET["search_limit"] start_time = time.time() word = request.GET["search_word"] #検索結果を表示。2次元配列が返却される(コードは省略しています) tweets_list = scraping.search_twitter(word, start_date, end_date) end_time = int(time.time() - start_time) context = { "search_word" : word, "start_date" : start_date, "end_date" : end_date, "data" : tweets_list, "time" : end_time } # ■■■■ここにcsv_export関数で使うための配列をクラスプロパティにセットしたい■■■■ self.__list = tweets_list return render(request,"search/results.html",context) return render(request,"search/base.html") def post(self, request, *args, **kwargs): pass index = SearchView.as_view()
templates/base.html
{% load static %} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Twitter検索 (snscrape)</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous"> <link rel="stylesheet" href="{% static 'css/style.css' %}"> {% block head %} {% endblock %} </head> <body> <h1 class="title"><a href="{% url 'search:index' %}">Twitter検索 (snscrape)</a></h1> <main class="container"> <form class="search_area" action=""> 取得開始日:<input class="form-control" type="date" name="start_date" value="{{ start_date }}"> 取得終了日:<input class="form-control" type="date" name="end_date" value="{{ end_date }}"> 検索キーワード(Enter)<input class="form-control" type="text" name="search_word" autofocus value="{{ search_word }}"> </form> {% block main %} {% endblock %} </main> </body> </html>
templates/results.html
{% extends "search/base.html" %} {% block main %} <!--ここに検索結果を表示する--> {% if data|length != 0 %} <p>{{ data|length }} 件ヒットしました (所要時間:約 {{ time }} 秒)</p> <button type=“button” onclick="location.href='/csv'">CSVダウンロード</button> <p>{{ data }} </p> {% for content in data %} <div class="sitelink_area"> <div class="sitelink"><a href="{{ content.url }}">{{ content.title }}</a></div> <!--truncatechars_htmlで指定文字数で切り詰めできる--> <div class="url">{{ content.url|truncatechars_html:"100" }}</div> </div> {% endfor %} {% else %} <p><span class="caution"> {{ search_word }} の検索結果は見つかりませんでした。</span>(所要時間:約 {{ time }} 秒)</p> {% endif %} {% endblock %}
まだ回答がついていません
会員登録して回答してみよう