일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- double ended queue
- 백준
- vscode
- 입/출력
- 장고란
- Django란
- 알고리즘 공부방법
- c++
- 엑셀
- 구조체와 클래스의 공통점 및 차이점
- EOF
- Django Nodejs 차이점
- 이분그래프
- getline
- Django의 편의성
- scanf
- 매크로
- 자료구조
- 표준 입출력
- correlation coefficient
- k-eta
- 입출력 패턴
- string 메소드
- 시간복잡도
- 프레임워크와 라이브러리의 차이
- 2557
- iOS14
- string 함수
- UI한글변경
- 연결요소
- Today
- Total
Storage Gonie
47. (app3) main view 에서 이미지 보여주기 본문
1. kilogram/urls.py에서 IndexView클래스를 login_required로 감싸준다.
- 로그인을 했을 때만 사진이 보여지도록 함.
- 아래의 방법은 여러가지 방법중 하나일 뿐.
from django.contrib.auth.decorators import login_required
urlpatterns = [
url(r'^$', login_required(views.IndexView.as_view()), name='index'),
url(r'^upload$', views.upload, name='upload'),
]
2. mysite/urls.py에서도 1번과 같이 해준다.
from django.contrib.auth.decorators import login_required
urlpatterns = [
url(r'^$', login_required(kilogram_views.IndexView.as_view()), name='root'),
]
3. views.py에서 IndexView클래스를 TemplateView가 아닌 ListView를 상속받도록 수정한다.
from django.views.generic.list import ListView
class IndexView(TemplateView): # 제네릭의 TemplateView는 아무기능 없이 템플릿만 표시해 주는 뷰에서 사용
template_name = 'kilogram/index.html'
class IndexView(ListView):
# model = Photo 이렇게 해주면 사용자를 안가리고 모든 photo객체가 넘어가게 되므로 아래와 같이 쿼리를 지정해줌.
context_object_name = 'user_photo_list' # 템플릿에 전달되는 이름
def get_queryset(self):
user = self.request.user # 로그인되어있는 사용자
return user.photo_set.all().order_by('-pub_date')
4. localhost:8000/kilogram 에 접속해봄
- 사진을 보여주기 위해 kilogram/photo_list.html을 찾고있음을 알 수 있음.
5. kilogram/index.html의 이름을 photo_list.html로 변경해줌
{% extends 'kilogram/base.html' %}
{% block content %}
<h1>Kilogram Main Page</h1>
{% endblock %}
{% extends 'kilogram/base.html' %}
{% block content %}
<p> <a class="btn btn-primary" href="{% url 'kilogram:upload'%}">업로드</a></p>
{% if user_photo_list %}
{% for photo in user_photo_list %}
<div class="panel panel-default" align="center">
<div class="panel-heading"><h4>{{photo.owner.username}}</h4></div>
<div class="panel-body">
{% if photo.image.width > 800 %}
<p><img src = '{{photo.image.url}}' width='600' /> <br>
{% else %}
<p><img src = '{{photo.image.url}}' /> <br>
{% endif %}
{{photo.comment}}</p>
</div>
</div>
{% endfor %}
{% else %}
<h4>아직 사진이 없네요. 첫번째 사진을 업로드하세요!</h4>
{% endif %}
{% endblock %}
<사진이 있는경우>
<사진이 없는경우>
7. 페이지 네이션을 구현.
- DB의 입장에서는 페이징 쿼리를 구현한다라고 함.
- 웹 서버의 입장에서는 페이지 네이션을 구현한다고 함.
- 1) views.py의 IndexView클래스에서 paginate_by 를 추가해줌
- 2) photo_list.html에 아래의 코드를 삽입
paginate_by = 2 # 사진을 몇개씩 보여줄 것인지 지정.
<!-- pagenation nav -->
{% if is_paginated %}
<nav aria-label="...">
<ul class="pager">
{% if page_obj.has_previous %}
<li><a href="{%url 'kilogram:index'%}?page={{ page_obj.previous_page_number }}">이전</a></li>
{% endif %}
<li> <a href="#">페이지 {{ page_obj.number }} / {{ page_obj.paginator.num_pages }} </a></li>
{% if page_obj.has_next %}
<li>
<a href="{%url 'kilogram:index'%}?page={{ page_obj.next_page_number }}">다음</a>
</li>
{% endif %}
</ul>
</nav>
{% endif %}
'웹개발 > Django 웹서비스 개발(인프런)' 카테고리의 다른 글
49. (app3) Django 프로필 페이지 만들기 (0) | 2019.02.28 |
---|---|
48. (app3) Django 소셜로그인 구현하기(페이스북, 다른건 응용가능) (1) | 2019.02.27 |
46. (app3) photo form 만들기(사진 업로드 페이지) / login 템플릿 수정(로그인 성공시 바로 이전페이지로 이동) (0) | 2019.02.23 |
45. (app3) Photo 모델 생성 / MEDIA_URL 설정 (0) | 2019.02.22 |
44. (app3) Django id, pw만 입력받는 회원가입에서 email까지 입력받도록 추가 (0) | 2019.02.22 |