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

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

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

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

Python 3.x

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

Q&A

1回答

1109閲覧

Djangoでのテストの書き方について

Ykkykk

総合スコア140

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2018/07/30 06:05

前提・実現したいこと

Djangoでのテスト用のコードを書きたいです。
こちらで質問しましたように、Djangoを使用してのファイルアップローダを作成しようとしております。
テスト用のコードを書いてみたのですが、エラーが出ており、それがどういうことなのか、またどうすれば消えるのかがわかりません。

発生している問題・エラーメッセージ

AttributeError: 'NoneType' object has no attribute 'file_name'

該当のソースコード

Django

1# upload_form/views.py 2 3from django.shortcuts import render, redirect 4from django.template.context_processors import csrf 5from django.conf import settings 6from .models import FileNameModel 7from .forms import UploadFileForm 8 9import sys, os 10 11import pandas as pd 12import numpy as np 13 14UPLOADE_DIR = os.path.dirname(os.path.abspath(__file__)) + '/static/files/' 15 16# Create your views here. 17 18class InvalidSourceException(Exception): 19 pass 20 21 22def form(request): 23 if request.method == 'POST': 24 form = UploadFileForm(request.POST, request.FILES) 25 if form.is_valid(): 26 27 file = request.FILES['file'] 28 29 path = os.path.join(UPLOADE_DIR, file.name) 30 31 with open(path, 'wb') as destination: 32 33 for chunk in file.chunks(): 34 destination.write(chunk) 35 36 df = pd.read_csv(path) 37 38 insert_data = FileNameModel(file_name = file.name) 39 insert_data.save() 40 41 return redirect(to='complete/') 42 else: 43 form = UploadFileForm() 44 return render(request, 'upload_form/form.html', {'form':form}) 45 46def complete(request): 47 f = FileNameModel.objects.order_by('id').last() 48 path = os.path.join(UPLOADE_DIR, f.file_name) 49 df = pd.read_csv(path) 50return render(request,読み込んだファイルを表示するようにする)

Django

1# upload_form/tests.py 2 3class ViewsTest(TestCase): 4 def test_complete_get(self): 5 response = self.client.get(resolve_url('upload_form:complete')) 6 self.assertEqual(200, response.status_code)

試したこと

上記エラーは、tests.pyのtest_complete_get()関数で生じています。
views.pyのcomplete関数にある

path = os.path.join(UPLOADE_DIR, f.file_name)

の部分でファイルが見つけられないということなのだと思うのですが…。

補足情報(FW/ツールのバージョンなど)

Python 3.6.5
Django 2.0

ご教示いただけますと幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

1、まずエラー名でググる('NoneType' object has no attribute 検索)

2、同じように困っている人を探す(http://reconf-shell.hatenablog.com/entry/2016/08/04/155244)

3、その人たちがたどり着いた解決方法を見つける

4、エラーの意味を理解する(attribute → オブジェクトが持つ関数、'NoneType' → 所謂Nullオブジェクト)

###追記

aaa.fuga()

bbb.name
において
aaaやbbbはオブジェクト、fuga()やnameなどはattributeと呼ばれます。
NoneTypeとはオブジェクトの型名です。
エラーの内容を見てみると、NoneTypeオブジェクトはfile_nameというattribute(属性)を持っていない
という内容になるのは分かりますか?

Python

1f = FileNameModel.objects.order_by('id').last() 2path = os.path.join(UPLOADE_DIR, f.file_name)

あなたのコードでいう
f.file_name
のfのオブジェクト型はNoneTypeになっています。
つまりその前の
FileNameModel.objects.order_by('id')
これが上手く行っていません。idから何かを取得しようとしていますが取れていない状況です。
こんな感じで調べてください。

投稿2018/07/30 06:16

編集2018/07/30 06:39
_Victorique__

総合スコア1392

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

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

Ykkykk

2018/07/30 06:29

ご回答いただきありがとうございます。 実はご教示いただいたサイトも閲覧していたのですが、解決法がよくわかりませんでした。 ファイルをアップロードしていないので何もないところにアクセスしようとしているということはわかるのですが、同じテストをform関数に対して行ったところエラーが出ませんでしたので、ファイルがないということなのかもよくわかっていない状態です。
Ykkykk

2018/07/30 07:17 編集

加えてお教えいただきありがとうございます。 データを取れてきていないとのことなので、 FileNameModel.objects.all.order_by('id').last() にしてみたのですが、そうすると、プログラムの処理がエラーで止まってしまいました。 function object has no attribute 'order_by' というエラーが出たのですが、FileNameModelはモデルで定義しております。 Djangoのドキュメントを見ると、FileNameModel.objects.order_by('id')という書き方で正しいようですね…。すみません。
Ykkykk

2018/07/30 07:46

該当箇所を f = FileNameModel.objects.latest('id') というように書き換えたところ、プログラム自体は同様に動いているのですが、やはりテストでエラーが出てしまいます。 上記のように書き換えたろころ、 upload_form.models.DoesNotExist: FileNameModel matching query does not exist. というエラーに変わってしまいました。また、fをテンプレートに渡すと、開発サーバで起動しているウェブ上ではファイルのクエリ(?)が表示されているのですが、なぜテストではファイルが存在しないことになるのでしょうか?何度もすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問