본문 바로가기

Python/Django

[Django] 템플릿과 DB 모델 연결하기

이번에는 템플릿과 데이터베이스 모델을 어떻게 연결하는지에 대해서 알아보겠습니다.

 

하지만 Django와 관련하여 아직 배우지 못한 두 가지 주요 아이디어가 여전히 있음을 유념해주세요.
우리가 배워야 할 주요 기능은 Django Form입니다.
Django는 Python에서 템플릿 및 클래스 기반 뷰에 이르기까지 폼을 자동으로 생성할 수 있습니다.
이는 모델을 기반으로 하는 DetailView 또는 ListView와 같은 뷰를 자동으로 생성하는 매우 강력한 도구입니다.
따라서 그 모델 클래스를 사용하는 것만으로도 많은 작업을 수행할 수 있습니다.

 

 

 

  • 새로운 view 생성 및 url 연결방법(이미 알고 있는 부분이지만 다시한번 정리합니다)

1. 장고앱 내부의 views.py 수정(\office\views.py)

 

from django.shortcuts import render

# Create your views here.
def list_patients(request):
    return 'nothing'

 

 

2. 장고앱 내부에 urls.py 생성

 

from django.urls import path
from . import views

# domain.com/office ---> list of all the patients
# urlspatterns 철자를 틀리게하여 오류가 발생하게 코딩함
urlspatterns = [
    path('', views.list_patients, name = 'list_patients'),
]

 

 

3. 프로젝트의 urls.py 수정 - 직접/간접 호출하는 경우, 모두 구현, 현재는 간접호출로 설정됨.

 

"""my_site URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('office/', include('office.urls')),
    path('admin/', admin.site.urls),
]

 

 

여기까지가 기본적인 구조입니다.

여기서 모델을 연결하기 위해서는 views.py 파일에 대한 추가 코딩이 필요합니다.

 

from django.shortcuts import render
from . import models # 모델 추가

# Create your views here.
def list_patients(request):
    all_patients = models.Patient.objects.all()
    context_list = {'patients' : all_patients}

    return render(request, 'office/list.html', context=context_list)

 

 

템플릿 만들기 - .\my_site\office\templates\office\list.html

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Patients List</title>
</head>
<body>
    {{patients}}
</body>
</html>

 

 

오류 로그 - 앱내부의 urls.py 에 의도한 철자 오류. 철자를 수정하면 된다.

 

(django) D:\workspace\Python\Django\DJANGO4\DJANGO_COURSE_V2\08-Django-Models-Databases\my_site>python manage.py runserv
er
Watching for file changes with StatReloader
Performing system checks...

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\urls\resolvers.py", line 717, in url_patterns    
    iter(patterns)
TypeError: 'module' object is not iterable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\threading.py", line 1009, in _bootstrap_inner
    self.run()
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\threading.py", line 946, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper        
    fn(*args, **kwargs)
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\core\management\commands\runserver.py", line 134, in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\core\management\base.py", line 475, in check     
    all_issues = checks.run_checks(
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\core\checks\registry.py", line 88, in run_checks 
    new_errors = check(app_configs=app_configs, databases=databases)
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\core\checks\urls.py", line 14, in check_url_config
    return check_resolver(resolver)
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\core\checks\urls.py", line 24, in check_resolver 
    return check_method()
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\urls\resolvers.py", line 495, in check
    messages.extend(check_resolver(pattern))
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\core\checks\urls.py", line 24, in check_resolver 
    return check_method()
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\urls\resolvers.py", line 494, in check
    for pattern in self.url_patterns:
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\utils\functional.py", line 57, in __get__        
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\MIKE-mini\.conda\envs\django\lib\site-packages\django\urls\resolvers.py", line 725, in url_patterns    
    raise ImproperlyConfigured(msg.format(name=self.urlconf_name)) from e
django.core.exceptions.ImproperlyConfigured: The included URLconf '<module 'office.urls' from 'D:\\workspace\\Python\\Django\\DJANGO4\\DJANGO_COURSE_V2\\08-Django-Models-Databases\\my_site\\office\\urls.py'>' does not appear to have any patterns in it. If you see the 'urlpatterns' variable with valid patterns in the file then the issue is probably caused by a circular import.

 

 

앱내부에 템플릿 설정하는 방법이 기억나지 않으면 이전 블로그를 참고하세요.

 

2022.10.25 - [Python/Django] - [Django] Django - (맛보기 migrate)App별 template 디렉토리

 

[Django] Django - (맛보기 migrate)App별 template 디렉토리

이번에는 앱별로 템플릿 디렉토리를 만들어서 관리하는 방법에 대해서 알아보겠습니다. settings.py 파일의 INSTALLED_APPS 변수에 그 커스텀 Django 앱을 등록해야 합니다. 1단계 새로운 Django 앱 생성 - m

unsungit.tistory.com

 

 

앱레벨의 urls.py 파일에서 urlpatterns 철자 오류를 수정하면 아래 처럼 디비의 정보를 화면에 보여줄 수 있다.

 

 

 

템플릿을 보기 좋게 수정하겠습니다 - .\my_site\office\templates\office\list.html

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Patients List</title>
</head>
<body>
    {{patients}}
    <br><br>
    <ul>
        {% for person in patients %}
            <li>{{person}}</li>
        {% endfor %}
    </ul>
</body>
</html>

 

결과 화면 - 보기편하게 수정된 화면