오늘은 Bookmark리스트를 통해 들어갈 홈페이지 선택이 해당url을 보여주는 bookmark를 만들어보려한다.
모델링은 id(number), name(title), url 세개로 구성할수 있다.
홈페이지 리스트를 보여주는 화면은 /bookmark/ 를 url로 하고 ListView (템플릿뷰를 이용하고), bookmark_list.html 템플릿과 연결할것이다.
홈페이지 선택해서 url을 보여주는 화면은 /bookmark/index 를 url로 DetailView를 템플릿뷰로,
bookmark_detail.htmlt 템플릿과 연결할것이다.
해야할 작업들이다.
모델링
from django.db import models
class Bookmark(models.Model):
title = models.CharField('TITLE', max_length=100, blank='True')
url = models.URLField('URL',unique=True)
def __str__(self):
return self.title
URLconf작성
from django.contrib import admin
from django.urls import path
from bookmark.views import BookmarkLV,BookmarkDV
urlpatterns = [
path('admin/', admin.site.urls),
#class-based view
path('bookmark/',BookmarkLV.as_view(), name = 'index'),
path('bookmark/<int:pk>/',BookmarkDV.as_view(), name = 'detail')
클래스형 뷰가 views.py에서 굉장히 간단할경우 urls.py 파일 안에서 간단히 작성 가능하지만, 향후 확장성을 고려할때 좋은 방법은 아니다.
views.py작성
from django.views.generic import ListView,DetailView
from bookmark.models import Bookmark
class BookmarkLV(ListView):
model = Bookmark
class BookmarkDV(DetailView):
model = Bookmark
class BookmarkLV는 bookmark 테이블의 레코드 리스트를 보여주기위한 뷰다.
컨텍스트 변수로 템플릿에 넘겨주면됨. 이때 컨텍스트변수는 1.object_list을 사용하고 2.모델명 소문자_list.html이 탬플릿명으로 알아서 정해진다.
BookmarkDV는 레코드 상세 내용을 보여주기위한것이다. 컨텍스트 변수로 객체를 레코드 객체를 담고, 디폴틀로 컨텍스트변수는 object, 모델명소문자_detail.html형식의 템플릿으로 알아서 정해진다.
bookmark_list.html
<!DOCTYPE html>
<html>
<head>
<title>Django Bookmark List</title>
</head>
</html>
<body>
<div id="content">
<h1>Bookmark List</h1>
<ul>
{% for bookmark in object_list %}
<li><a href = "{% url 'detail' bookmark.id %}">{{ bookmark }}</a></li>
{% endfor %}
</ul>
</div>
</body>
{{ bookmark }}는 템플릿변수를 가져오는것인데, 테이블 특정레코드를 의미한다.
해당 객체는models.py에서 str()메소드를 통해 호출된다. 이때 title을 호출하도록 코딩함.
Bookmark_detail.html
<!DOCTYPE html>
<html>
<head>
<title>Django Bookmark Detail</title>
</head>
<body>
<div id="content">
<h1>{{ object.title }}</h1>
<ul>
<li>URL:<a href="{{ object.url }}">{{ object.url }}</a> </li>
</ul>
</div>
</body>
</html>
object객체는 클래스뷰에서 넘어온 컨텍스트변수의 특정객체다.
object.url은 보여지는것도 변수이고, 링크도 넘어온 변수다.
결과