728x90
반응형
accountview 같은걸 만들때는 단일 객체만 보면 됐었다. detailview 하면 그 사람의 정보, 그 게시물의 정보 이런식이었는데 최종적으로는 게시판의 형태를 만들어야하니까 여러개의 객체를 다룰 수 있는 그런 view가 필요하다. 여러개의 게시글을 한번에 보여줄 수 있는 방법이 필요하다.
그래서 나오는 것이 List view 이다. (django 기본 제공)
basicform
class ArticleListView(ListView):
model = Article
context_object_name = 'article_list'
template_name = 'articleapp/list.html'
paginate_by = 25
*pagination 이란: page의 객체를 생성한다.
html template에서 쓸 객체들: 'article_List', 'page_obj'
1
articleapp/views.py
class ArticleListView(ListView):
model = Article
context_object_name = 'article_list'
template_name = 'articleapp/list.html'
paginate_by = 25
2
urls.py
path('list/', TemplateView.as_view(template_name='articleapp/list.html'), name='list'),
원래 list path가 있었는데 그냥 템플릿뷰를 쓰고 있었다. 이걸 위에서 만든 뷰로 교체
from django.urls import path
from django.views.generic import TemplateView
from articleapp.views import ArticleCreateView, ArticleDetailView, ArticleUpdateView, ArticleDeleteView, ArticleListView
app_name = 'articleapp'
urlpatterns = [
path('list/', ArticleListView.as_view(), name='list'),
path('create/', ArticleCreateView.as_view(), name='create'),
path('detail/<int:pk>', ArticleDetailView.as_view(), name='detail'),
path('update/<int:pk>', ArticleUpdateView.as_view(), name='update'),
path('delete/<int:pk>', ArticleDeleteView.as_view(), name='delete'),
]
3
list.html
{% extends 'base.html' %}
{% load static %}
{% block content %}
<style>
.container div {
width: 250px;
background-color: antiquewhite;
display: flex;
justify-content: center;
align-items: center;
border-radius: 1rem;
}
.container img {
width: 100%;
border-radius: 1rem;
}
</style>
<div class="container">
{% for article in article_list %}
<a href="{% url 'articleapp:detail' pk=article.pk %}">
<div>
<img src="{{ article.image.url }}" alt="">
</div>
</a>
</div>
<div style="text-align:center;">
<a href="{% url 'articleapp:create' %}" class="btn btn-dark rounded-pill col-3 mt-3 mb-3">
Create Article
</a>
</div>
<script src="{% static 'js/magicgrid.js' %}"></script>
{% endblock%}
4
카드에 해당하는 코드조각은 따로 빼줄것이다. templates/snippets/card.html
<div>
<img src="{{ article.image.url }}" alt="">
</div>
list.html 은 수정
{% extends 'base.html' %}
{% load static %}
{% block content %}
<style>
.container div {
width: 250px;
background-color: antiquewhite;
display: flex;
justify-content: center;
align-items: center;
border-radius: 1rem;
}
.container img {
width: 100%;
border-radius: 1rem;
}
</style>
{% if article_list %}
<div class="container">
{% for article in article_list %}
<a href="{% url 'articleapp:detail' pk=article.pk %}">
{% include 'snippets/card.html' with article=article %}
</a>
{% endfor %}
</div>
<script src="{% static 'js/magicgrid.js' %}"></script>
{% else %}
<div class="text-center">
<h1>No Articles Yet</h1>
</div>
{% endif %}
{% include 'snippets/pagination.html' with page_obj=page_obj %}
<div style="text-align:center;">
<a href="{% url 'articleapp:create' %}" class="btn btn-dark rounded-pill col-3 mt-3 mb-3">
Create Article
</a>
</div>
{% endblock%}
5
snippets/pagination.html
<div style="text-align: center; margin: 1rem 0;">
{% if page_obj.has_previous %}
<a href="{% url 'articleapp:list' %}?page={{ page_obj.previous_page_number }}"
class="btn btn-secondary rounded-pill">
{{ page_obj.previous_page_number }}
</a>
{% endif %}
<a href="{% url 'articleapp:list' %}?page={{ page_obj.number }}"
class="btn btn-secondary rounded-pill active">
{{ page_obj.number }}
</a>
{% if page_obj.has_next %}
<a href="{% url 'articleapp:list' %}?page={{ page_obj.next_page_number }}"
class="btn btn-secondary rounded-pill">
{{ page_obj.next_page_number }}
</a>
{% endif %}
</div>
page_obj 인자의 객체:
has_previous: 현재 페이지에서 이전페이지가 있는지 없는지를 판단하는 객체
has_next: 다음페이지가 있는지 판단
728x90
반응형
'웹 프로그래밍' 카테고리의 다른 글
[pinterest clone (31)] 모바일 디버깅, 반응형 레이아웃 (0) | 2021.05.02 |
---|---|
[pinterest clone (30)] commentapp 구현과 Mixin (0) | 2021.05.02 |
[pinterest clone (28)] 문제사항 수정 (0) | 2021.05.01 |
[pinterest clone (27)] articleapp 구현 (0) | 2021.05.01 |
[pinterest clone (26)] Articleapp 화면구성 (MagicGrid) (0) | 2021.05.01 |