前提
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
1from django.contrib import admin 2from django.urls import path,include 3from .views import helloworldfunc 4 5urlpatterns = [ 6 path('admin/', admin.site.urls), 7 path('', include("search.urls"),name="search"), 8]
twittersearch/search/urls.py
1from django.urls import path 2from . import views 3 4app_name = "search" 5urlpatterns = [ 6 path('csv/', views.SearchView.csv_export,), 7 path('', views.index, name="index"), 8]
twittersearch/search/views.py
1import csv 2import os 3from django.http import HttpResponse 4from django.shortcuts import render 5 6from django.views import generic 7 8from django.views import View 9 10from . import scraping 11 12import time 13 14import pandas as pd 15 16#Viewを継承してGET文、POST文の関数を作る 17class SearchView(View): 18 def __init__(self): 19 self:list = None 20 def get_list(self): 21 return self.__list 22 23 def set_list(self, list): 24 self.__list = list 25 26 def csv_export(request, self): 27 response = HttpResponse(content_type='text/csv') 28 response['Content-Disposition'] = 'attachment; filename="result.csv"' 29 writer = csv.writer(response) 30 31 # ■■■■ここにget関数でセットしたcsv用の配列をresponseオブジェクトに書き込みたい■■■■ 32 for tweets in this.get_list(self): 33 writer.writerow(tweets) 34 35 return response 36 37 def get(self, request, *args, **kwargs): 38 if "search_word" in request.GET: 39 print(request) 40 if request.GET["search_word"] != "": 41 start_date = request.GET["start_date"] 42 end_date = request.GET["end_date"] 43 # search_limit = 100 44 # if request.GET["search_limit"] != "": 45 # search_limit = request.GET["search_limit"] 46 start_time = time.time() 47 48 word = request.GET["search_word"] 49 50 #検索結果を表示。2次元配列が返却される(コードは省略しています) 51 tweets_list = scraping.search_twitter(word, start_date, end_date) 52 end_time = int(time.time() - start_time) 53 54 context = { "search_word" : word, 55 "start_date" : start_date, 56 "end_date" : end_date, 57 "data" : tweets_list, 58 "time" : end_time 59 } 60 # ■■■■ここにcsv_export関数で使うための配列をクラスプロパティにセットしたい■■■■ 61 self.__list = tweets_list 62 return render(request,"search/results.html",context) 63 64 return render(request,"search/base.html") 65 66 def post(self, request, *args, **kwargs): 67 68 pass 69 70index = SearchView.as_view()
templates/base.html
1{% load static %} 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6 <meta charset="UTF-8"> 7 <meta name="viewport" content="width=device-width,initial-scale=1"> 8 <title>Twitter検索 (snscrape)</title> 9 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> 10 <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous"> 11 12 <link rel="stylesheet" href="{% static 'css/style.css' %}"> 13 {% block head %} 14 {% endblock %} 15 16 17</head> 18<body> 19 <h1 class="title"><a href="{% url 'search:index' %}">Twitter検索 (snscrape)</a></h1> 20 21 <main class="container"> 22 <form class="search_area" action=""> 23 24 取得開始日:<input class="form-control" type="date" name="start_date" value="{{ start_date }}"> 25 取得終了日:<input class="form-control" type="date" name="end_date" value="{{ end_date }}"> 26 検索キーワード(Enter)<input class="form-control" type="text" name="search_word" autofocus value="{{ search_word }}"> 27 </form> 28 29 {% block main %} 30 {% endblock %} 31 </main> 32 33</body> 34</html> 35
templates/results.html
1{% extends "search/base.html" %} 2 3{% block main %} 4 5<!--ここに検索結果を表示する--> 6{% if data|length != 0 %} 7<p>{{ data|length }} 件ヒットしました (所要時間:約 {{ time }} 秒)</p> 8<button type=“button” onclick="location.href='/csv'">CSVダウンロード</button> 9 10<p>{{ data }} </p> 11 12 13{% for content in data %} 14<div class="sitelink_area"> 15 <div class="sitelink"><a href="{{ content.url }}">{{ content.title }}</a></div> 16 <!--truncatechars_htmlで指定文字数で切り詰めできる--> 17 <div class="url">{{ content.url|truncatechars_html:"100" }}</div> 18</div> 19{% endfor %} 20 21{% else %} 22<p><span class="caution"> {{ search_word }} の検索結果は見つかりませんでした。</span>(所要時間:約 {{ time }} 秒)</p> 23 24{% endif %} 25 26 27{% endblock %} 28 29
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。