본문 바로가기

Backup/Django

[Django #10] Working with Foreign Keys

이번장에서는 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"),

이제 홈페이지를 보면 아래와 같다.


python tutorials

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를 클릭하면 다음과 같은 화면을 얻는다

python tutorials


'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