장고 MTV 모델을 이해하고 게시글 목록을 보는 페이지를 작성했다
html에서 사용자의 request(urls.py)->서버에서 응답 및 데이터처리(views.py)->다시 사용자에게 보여주기(html)
from django.contrib import admin
from django.urls import path
from BANGAPP import views
from BANGAPP.views import LoginView,LikeArticleView,HateListView
path('list_themeRev/', views.list_themeRev, name="list_themeRev"),
path('detail/themeRev/<int:themeRev_pk>', views.detail_themeRev, name="detail_themeRev"),
path('liketest/<int:pk>', LikeArticleView.as_view(), name="article_like"),
path('like/', views.like, name="like"),
path의 첫번째 인자는 사용자의 request다.
사용자가 127.0.0.1:8000/list_themeRev를 입력 한다면~
두번째 인자는 받은 request로 어떤 행동을 취할지이다.
views.py의 list_themeRev라는 view를 실행시킨다
세번째 이름은 사용자의 request에 대한 별명 같은 것인데, 주로 html에서 자주 불린다.
{% url list_themeRev %}로 views.list_themeRev를 작동시키는 등
detail/themeRev/<int:themeRev_pk>는
detail/themeRev/ 뒤에 어떤 int형 숫자가 들어오는데, 이걸 themeRev_pk라는 변수에 저장할 것이라는 뜻이다.
이걸로 몇번째 디테일 페이지를 열어 줄 것인지가 결정된다.
이렇게 받은 themeRev_pk는 view에서 다음과 같이 사용된다.
def detail_themeRev(request, themeRev_pk):
themeRev = ThemeRev.objects.get(pk=themeRev_pk)
if request.method == "POST":
return redirect('detail_themeRev', themeRev_pk)
return render(request, 'detail_themeRev.html', {'themeRev': themeRev})
html에서는 이렇게 사용되는데,
<a href="{% url 'detail_themeRev' review.pk %}">
여기서의 review는 view에서 가져온 수많은 themeRev들 중 하나를 의미하고, 그 themeRev의 pk에 해당하는 값을 themeRev_pk로 받겠다는 뜻이다. 그러니까
detail/themeRev/review.pk에 해당하는 url이 열린다.
review.pk는 detail_themeRev view의 두번째 인자 themeRev_pk에 들어간다.
목록 하나하나를 작성하는 view는 다음과 같이 쓸 수 있다.
def list_themeRev(request):
themes = Theme.objects.all()
reviews = ThemeRev.objects.all()
shops = Shop.objects.all()
content = {
'themes':themes, 'reviews':reviews, 'shops':shops,
}
return render(request,'list_themeRev.html', content)
테마 하나하나, 가게에 대한 정보 하나하나, 테마 리뷰 하나하나에 대한 정보들이 html에 들어가야 하므로 모델 전체를 키값과 value값이 있는 content로 묶어서 render한다.
list_theme.py
{% for review in reviews %}
{% for theme in themes%}
{% if review.theme_ID_id == theme.themeID %}
{% for shop in shops %}
{% if shop.shopID == theme.ShopID_id %}
<div class="info">
<img src="{% get_static_prefix %}{{review.themeRevImage}}"/>
<div>
<div>{{shop.shopName}}</div>
<div>{{shop.Location}}</div>
<div>{{review.themeRevRating}}</div>
</div>
</div>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
review.theme_ID_id는, python3 manage.py shell에서
from appname.models import ThemeRev
ThemeRev.objects.all().values()
명령어로 알아낸 값이다.
각각의 테마의 pk값이 리뷰의 theme_ID_id값과 같아야 그 테마에 대해 작성한 리뷰를 구할 수 있다.
또한 그 테마가 속해있는 가게 정보를 얻기 위해서는 가게의 pk값이 테마의 ShopID_id값과 같아야 한다.