이번장에서는 foreign key를 사용해서 각 table간 어떻게 작동시키게 할건지를 만들어 보겠다.
우리는 각 series 페이지에 들어갈때 주소를 simple하게 하나의 제목 "one slash"로 구성하게 할것이다. 대부분의 사이트는 directory안에 있으면 그 full 경로를 주소창에 쳐야 접속이 되겠지만 가 지져분해보이고 내가만든 사이트에서는 그리 복잡한 구조가 아니기 때문에 그냥 단순히 파일이름을 치면 그 웹페이지로 가게 할것이다.
이런 기능을 위해서 view에서 내용을 검색하고 주소를 반환해주는 하나의 함수가 필요하고 이를 single_slug함수라 하겠다.
from .models import Tutorial, TutorialCategory, TutorialSeries
from django.http import HttpResponse ... def single_slug(request, single_slug): categories = [c.category_slug for c in TutorialCategory.objects.all()] if single_slug in categories: return HttpResponse(f"{single_slug} is a category") tutorials = [t.tutorial_slug for t in Tutorial.objects.all()] if single_slug in tutorials: return HttpResponse(f"{single_slug} is a Tutorial") return HttpResponse(f"'{single_slug}' does not correspond to anything we know of!")
그런다음 homepage function을 아래와 같이 바꾸자
tutorial 대신 categories를 interation시켜 내용을 보여주게 할것이다.
def homepage(request):
return render(request=request,
template_name='main/categories.html',
context={"categories": TutorialCategory.objects.all})
그럼
mysite/main/templates/categories.html 도 당연히 변수명을 바꿔야한다.
:
{% extends 'main/header.html' %} {% block content %} <div class="row"> {% for cat in categories %} <div class="col s12 m6 l4"> <a href="{{cat.category_slug}}", style="color:#000"> <div class="card hoverable"> <div class="card-content"> <div class="card-title">{{cat.tutorial_category}}</div> <!--<p style="font-size:70%">Published {{tut.tutorial_published}}</p>--> <p>{{cat.category_summary}}</p> </div> </div> </a> </div> {% endfor %} </div> {% endblock %}
마지막으로 controller를 urls.py를 통해 수정하자.
여기선 "single_slug"의 변수를 통해 제목을 url로 할것이다.
path("<single_slug>", views.single_slug, name="single_slug"),
이제 홈페이지를 보면 아래와 같다.
card의 내용이 tutorial 내용이 나오는게 아니라 categories의 내용이 나오게 된다.
자 이제 categories를 클릭하면 categories에 해당되는 메세지가 출력될것이다.
이제 이 categories의 해당되는 내용을 출력하게 해보자. 해당category의 모든 tutorial series objects를 가져오는 filter를 만들어보자
matching_series = TutorialSeries.objects.filter(tutorial_category__category_slug=single_slug)
그러면 tutorial series를 클릭하면 따로 url를 만들어줘야 하지만 우리는 일단 첫번째 series로 링크 시켜두자
for m in matching_series.all(): part_one = Tutorial.objects.filter(tutorial_series__tutorial_series=m.tutorial_series).earliest("tutorial_published") series_urls[m] = part_one.tutorial_slug
그러면 views.py
에 아래와 같이 함수를 만들어라
def single_slug(request, single_slug): # first check to see if the url is in categories. categories = [c.category_slug for c in TutorialCategory.objects.all()] if single_slug in categories: matching_series = TutorialSeries.objects.filter(tutorial_category__category_slug=single_slug) series_urls = {} for m in matching_series.all(): part_one = Tutorial.objects.filter(tutorial_series__tutorial_series=m.tutorial_series).earliest("tutorial_published") series_urls[m] = part_one.tutorial_slug return render(request=request, template_name='main/category.html', context={"tutorial_series": matching_series, "part_ones": series_urls})
Now we need to make this category.html
page:
mysite/main/templates/main/category.html
{% extends 'main/header.html' %} {% block content %} <div class="row"> {% for tut, partone in part_ones.items %} <div class="col s12 m6 l4"> <a href="{{partone}}", style="color:#000"> <div class="card hoverable"> <div class="card-content"> <div class="card-title">{{tut.tutorial_series}}</div> <!--<p style="font-size:70%">Published {{tut.tutorial_published}}</p>--> <p>{{tut.series_summary}}</p> </div> </div> </a> </div> {% endfor %} </div> {% endblock %}
이제 categories를 클릭하면 다음과 같은 화면을 얻는다
'Backup > Django' 카테고리의 다른 글
[Django #11] Dynamic sidebar (0) | 2019.02.06 |
---|---|
[Django #9] Foreign Keys with Models (0) | 2019.02.05 |
[Django #8] User Login and Logout (0) | 2019.02.05 |
[Django #7] Messages (0) | 2019.02.05 |
[Django #6] User Registration (1) | 2019.02.04 |