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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1545閲覧

djangoでcsv出力する処理を実現したい

kaitouEx

総合スコア21

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2022/08/05 09:32

編集2022/08/05 09:56

前提

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

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

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

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

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

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

guest

回答2

0

自己解決

検索ボタンを押下したら結果のhtmlに遷移していたのを、CSVを出力するようにして解決しました。
responseのcontent-typeをcsvにしました。

views.py

1import csv 2import os 3from django.http import HttpResponse 4from django.shortcuts import render 5from django.views import generic 6from django.views import View 7from . import scraping 8import time 9import pandas as pd 10 11#Viewを継承してGET文、POST文の関数を作る 12class SearchView(View): 13 def get(self, request, *args, **kwargs): 14 if "search_word" in request.GET: 15 if request.GET["search_word"] != "": 16 start_date = request.GET["start_date"] 17 end_date = request.GET["end_date"] 18 search_limit = request.GET["search_limit"] 19 start_time = time.time() 20 word = request.GET["search_word"] 21 22 response = HttpResponse(content_type='text/csv') 23 response['Content-Disposition'] = 'attachment; filename="result.csv"' 24 writer = csv.writer(response) 25 tweetsList = scraping.search_twitter(word, start_date, end_date, search_limit) 26 for tweets in tweetsList: 27 writer.writerow(tweets) 28 return response 29 30 return render(request,"search/base.html") 31 32index = SearchView.as_view()

投稿2022/08/13 08:28

kaitouEx

総合スコア21

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

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

0

第一引数をselfにしたらいい気がしました

diff

1- def csv_export(request, self): 2+ def csv_export(self, request):

投稿2022/08/06 01:34

hy-sksem

総合スコア49

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

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

kaitouEx

2022/08/10 01:57

ご確認とアドバイス、ありがとうございます! 第一引数をselfにしてみたのですがうまくいきませんでした。 エラーの解決もできなさそうなので、一旦は基本の習得のため、参考書を1冊仕上げてから出直したいと思います。また解決法が見つかれば追記したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問