実現したいこと
Djangoのアプリケーションの一部のページでServerError500の解消を実現したい。
発生している問題・分からないこと
以前、AWSのLightsailにデプロイしたDjangoのアプリケーションがあり、下記の内容を行う前は、エラーも出ることなく、正常に利用することができました。
・VSCode上(ローカル環境)で、Djangoのディレクトリ(「students」)のmodels.pyの不要なデータベース項目を削除し、マイグレーションを行いました。
エラーメッセージ
ロギング設定を行い、エラーログを確認したところ、下記の内容が出てきました。
error
1result = block.nodelist.render(context) 2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 3File "/opt/bitnami/python/lib/python3.11/site-packages/django/template/base.py", line 10 405, in render 5return SafeString("".join([node.render_annotated(context) for node in self])) 6^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 7File "/opt/bitnami/python/lib/python3.11/site-packages/django/template/base.py", line 10 805, in <listcomp> 9return SafeString("".join([node.render_annotated(context) for node in self])) 10^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 11File "/opt/bitnami/python/lib/python3.11/site-packages/django/template/base.py", line 96 126, in render_annotated 13return self.render(context) 14^^^^^^^^^^^^^^^^^^^^ 15File "/opt/bitnami/python/lib/python3.11/site-packages/django/template/base.py", line 10 1664, in render 17output = self.filter_expression.resolve(context) 18^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 19File "/opt/bitnami/python/lib/python3.11/site-packages/django/template/base.py", line 71 205, in resolve 21obj = self.var.resolve(context) 22^^^^^^^^^^^^^^^^^^^^^^^^^ 23File "/opt/bitnami/python/lib/python3.11/site-packages/django/template/base.py", line 84 247, in resolve 25value = self._resolve_lookup(context) 26^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 27File "/opt/bitnami/python/lib/python3.11/site-packages/django/template/base.py", line 89 280, in _resolve_lookup 29current = getattr(current, bit) 30^^^^^^^^^^^^^^^^^^^^^ 31File "/opt/bitnami/python/lib/python3.11/site-packages/django/db/models/fields/files.py" 32, line 65, in url 33self._require_file() 34File "/opt/bitnami/python/lib/python3.11/site-packages/django/db/models/fields/files.py" 35, line 40, in _require_file 36raise ValueError( 37ValueError: The 'img' attribute has no file associated with it.
該当のソースコード
students/models.py
1from django.db import models 2from django.urls import reverse 3from jp_birthday.models import BirthdayModel 4from datetime import datetime 5from accounts.models import Subject,CustomUser 6 7class Student(models.Model): 8 Choices_status = ( 9 ('coming', '通塾生'), 10 ('quitting', '退塾生'), 11 ('graduating', '卒業生'), 12 ) 13 14 name = models.CharField(max_length=200) 15 birthday = models.DateField() 16 school = models.ForeignKey(School, on_delete=models.CASCADE) 17 years = models.IntegerField() 18 entrance = models.DateField() 19 brother = models.CharField(max_length=10) 20 img = models.ImageField(blank=True) 21 explanation = models.TextField(blank=True, null=True) 22 mail = models.CharField(max_length=200, null=True, blank=True) 23 status = models.CharField(max_length=10,choices=Choices_status,default='coming') 24 25 def __str__(self): 26 return self.name 27 28 def get_absolute_url(self): 29 return reverse('list') 30 31 @property 32 def age(self): 33 # 現在の日付を取得 34 current_date = datetime.now() 35 # 生年月日と現在の日付の差を計算 36 age = current_date.year - self.birthday.year - ((current_date.month, current_date.day) < (self.birthday.month, self.birthday.day)) 37 return age 38 class Meta: 39 ordering = ['name'] 40
students/views.py
1from django.views.generic import TemplateView, ListView, DetailView 2from .models import Student,School,StudentSubject 3from django.urls import reverse_lazy 4from django.contrib.auth.mixins import LoginRequiredMixin 5from collections import defaultdict 6from django.db.models import Q 7from django.shortcuts import get_object_or_404 8from accounts.models import Subject, CustomUser 9from django.shortcuts import render, redirect 10from .forms import StudentForm 11 12class StudentDetailView(LoginRequiredMixin,DetailView): 13 model = Student 14 template_name = "students/student_detail.html" 15
【settings.py】 from pathlib import Path from environs import Env from pathlib import Path # Environment Variables env = Env() env.read_env() BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = env.str('SECRET_KEY') DEBUG = env.bool('DEBUG') ALLOWED_HOSTS = ['〇〇', '127.0.0.1'] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'students', 'django_bootstrap5', 'import_export', 'accounts.apps.AccountsConfig', 'lessons', 'exams', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'student_info.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR/'templates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'student_info.wsgi.application' if env.bool('LOCAL'): DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } else: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': env.str('DB_NAME'), 'USER': env.str('DB_USER'), 'HOST': env.str('DB_HOST'), 'PASSWORD': env.str('DB_PASSWORD'), 'PORT': env.int('DB_PORT'), } } AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo' USE_I18N = True USE_TZ = True STATIC_URL = 'static/' STATIC_ROOT = BASE_DIR / 'static' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media_local' AUTH_USER_MODEL = 'accounts.CustomUser' LOGIN_URL = 'login' LOGIN_REDIRECT_URL = 'list' LOGOUT_REDIRECT_URL = 'logout' CSRF_COOKIE_SECURE = True SESSION_COOKIE_SECURE = True import os import datetime today = datetime.date.today().strftime('%Y%m%d') LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'development': { 'format': '%(asctime)s [%(levelname)s] %(message)s' }, }, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'development', }, 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, f'logs/log_{today}.log'), 'formatter': 'development', }, }, 'loggers': { 'django': { 'handlers': ['file', 'console'], 'level': 'DEBUG', 'propagate': True, } },
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
現在、当スレッドで、アドバイスをいただきつつ、まず、ロギングのエラー解消に動いていましたがようやくロギングのエラーが解消できました。現在、本題のエラーの原因追及を行おうと思っています。
補足
回答1件
あなたの回答
tips
プレビュー