前提・実現したいこと
python3の初学者です。python3を用いて簡易的なスクレイピングのアプリを作成しています。現在は、ブラウザ上でビューファイルは問題なく表示され、urlを用いたスクレイピングも行えています。しかし、例外のurlで抽出すると、(IndexError: list index out of range)が発生するため、例外時に画面上にフォームエラーのメッセージを表示させたいのですが、表示されなくて困っております。
エラーメッセージの表示方法は以下のURLのサイトを参考にしました
参考URL
実際に実装を進めると、以下の様な(TemplateDoesNotExist at /path/to/form-alert.html)のエラーが発生している状況です。
発生している問題・エラーメッセージ
python
1Traceback (most recent call last): 2 File "/Users/hoge/.pyenv/versions/3.7.0/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner 3 response = get_response(request) 4 File "/Users/hoge/.pyenv/versions/3.7.0/lib/python3.7/site-packages/django/core/handlers/base.py", line 202, in _get_response 5 response = response.render() 6 File "/Users/hoge/.pyenv/versions/3.7.0/lib/python3.7/site-packages/django/template/response.py", line 105, in render 7 self.content = self.rendered_content 8 File "/Users/hoge/.pyenv/versions/3.7.0/lib/python3.7/site-packages/django/template/response.py", line 83, in rendered_content 9 return template.render(context, self._request) 10 File "/Users/hoge/.pyenv/versions/3.7.0/lib/python3.7/site-packages/django/template/backends/django.py", line 63, in render 11 reraise(exc, self.backend) 12 File "/Users/hoge/.pyenv/versions/3.7.0/lib/python3.7/site-packages/django/template/backends/django.py", line 84, in reraise 13 raise new from exc 14django.template.exceptions.TemplateDoesNotExist: path/to/form-alert.html
該当のソースコード
以下にエラーメッセージに関連するコードを記述します
form-alart.html
python
1{% if form.non_field_errors %} 2<ul class="alert alert-danger list-unstyled"> 3 <li style="list-style-type: none;"> 4<ul class="alert alert-danger list-unstyled">{% for error in form.non_field_errors %} 5 <li>{{ error }}</li> 6</ul> 7 </li> 8</ul> 9{% endfor %} 10 11{% endif %}
home.html
python
1{% extends 'base.html' %} 2 3{% block header %} 4<div class="jumbotron"> 5 <div class="container"> 6 <h1 class="display-4">News</h1> 7 <p class="lead">NewsのURLを記述してください</p> 8 </div> 9 </div> 10{% endblock header %} 11 12{% block content %} 13<div class="container"> 14{% include 'path/to/form-alert.html' %} #エラーを表示させたい箇所 15<form action='' method='POST'>{% csrf_token %} 16<p>URL: <input type="text" name='url'></p> 17<input type="submit" value="取得する"> 18</form> 19</div> 20{% endblock content %}
settings.pyのテンプレートの部分のコード
python
1TEMPLATES = [ 2 { 3 'BACKEND': 'django.template.backends.django.DjangoTemplates', 4 'DIRS': [BASE_DIR, 'templates'], 5 'APP_DIRS': True, 6 'OPTIONS': { 7 'context_processors': [ 8 'django.template.context_processors.debug', 9 'django.template.context_processors.request', 10 'django.contrib.auth.context_processors.auth', 11 'django.contrib.messages.context_processors.messages', 12 ], 13 }, 14 }, 15]
view.pyのコード
python
1from django.shortcuts import render 2from .models import News 3from django.views.generic import CreateView 4from django.urls import reverse_lazy 5import urllib.request 6import requests 7from bs4 import BeautifulSoup 8 9 10class Create(CreateView): 11 template_name = 'home.html' 12 model = News 13 fields = ('url',) 14 success_url = reverse_lazy('list') 15 16 17def listfunc(request): 18 for post in News.objects.all(): 19 url = post.url 20 list = [] 21 response = requests.get(url) 22 bs = BeautifulSoup(response.text, "html.parser") 23 ul_tag = bs.find_all(class_="yjnSubTopics_list") 24 for tag in ul_tag[0]: 25 title = tag.a.getText() 26 url2 = tag.a.get("href") 27 list.append([title, url2]) 28 context = {'list': list,} 29 return render(request, 'list.html', context)
試したこと
①エラーメッセージを表示させる記述「{% include 'path/to/form-alert.html' %} 」の配置する場所がおかしいのでは?と考え、ファイルの先頭や別ファイルなどに移動させてみたが、特に変化なし。
②settings.pyにて誤表記があるのでは?と考えたが、自分が見た中では、誤表記は見つけられなかった。
補足情報(FW/ツールのバージョンなど)
コードエディター VSコード
Python 3.7.0
Django 3.1.4
requests 2.25.1
beautifulsoup4 4.9.3
ディレクトリとファイルの構成
https://gyazo.com/434a1275b9db6c0e147dd6c18fd1b1c1
回答2件
あなたの回答
tips
プレビュー