Esimene lehekülg

URL seadistamine

Et teha lehekülgi, tuleb kõigepealt ära seadistada lehekülje URL-id.

Teeme faili mysite/news/urls.py ning lisame sinna mõned URL-i mustrid.

from django.urls import path

from . import views

urlpatterns = [
    path('articles/<int:year>/', views.year_archive, name="year"),
    path('articles/<int:year>/<int:question_id>/', views.article_detail, name="detail"),
]

See kood ühendab ära URL-id vastavate funktsioonidega views.py failis.

Django otsib kasutaja leheküljele vastavat funktsiooni views.py failist. Kui funktsioon leitakse, siis edastab Django päringu info ning URL-is leiduva info funktsioonile.

Muudame koodi failis mysite/mysite/urls.py, et peamine äpp (mysite) oskaks aadresse, mis algavad kujul news/ edasi suunata mysite/news/urls.py faili.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('news/', include('news.urls')),
    path('admin/', admin.site.urls),
]

Näide: aadressi news/articles/2005/39323/ põhjal kutsutakse välja funktsioon news.views.article_detail(request, year=2005, question_id=39323).

Vaated

Lisaks aadressi seadistusele tuleb kirjutada ka vaated. Kirjutame kaks lihtsalt vaadet faili news/views.py.

from django.shortcuts import render, get_object_or_404

from .models import Article


def year_archive(request, year):
    articles = Article.objects.filter(pub_date__year=year)
    context = {'year': year, 'article_list': articles}
    return render(request, 'news/year_archive.html', context)


def article_detail(request, year, question_id):
    article = get_object_or_404(Article, pk=question_id) # if article is not found display 404 error.
    context = {'year': year, 'article': article}
    return render(request, 'news/article_detail.html', context)

Meetod render() tagastab HTML lehekülje, võttes argumentideks:

  • päringu objekti;

  • malli, mille põhjal HTML sisu genereerida;

  • konteksti, mida mallis kasutada.

Päring ning kontekst on meil olemas, puudu on vaid mallid ehk templates.

Mallid

Mall on segu HTML-i ja Pythoni koodist, mille järgi genereeritakse HTML lehekülgi.

Kuna igal veebileheküljel on kattuvaid osasid, siis loome alustuseks põhja, mida teised mallid saavad laiendada.

Teeme faili news/templates/base.html

<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}
    <h1>My first site.</h1>
{% endblock content %}
</body>
</html>

Seda malli saavad teised mallid kasutada, kui alammallis on öeldud, et ta laiendab mingit kindlat malli{% extends "base.html" %}. Sellisel juhul saab üle kirjutada ülemmallist osi, mis on {% block block_name %} {% endblock%} vahele kirjutatud.

Nüüd teeme mallid funktsioonidele year_archive ja article_detail, need mallid laiendavad malli base.html.

news/templates/news/year_archive.html

{% extends "base.html" %}

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
    <h1>Articles for {{ year }}</h1>

    {% for article in article_list %}
        <div style="border: solid 2px">
            <a href="{% url 'detail' year article.id %}">{{ article.headline }}</a>
            <p>By {{ article.reporter.full_name }}</p>
            <p>Published at {{ article.pub_date|date:"F j, Y" }}</p>
        </div>
    {% endfor %}
{% endblock %}

news/templates/news/article_detail.html

{% extends "base.html" %}

{% block title %}{{ article.headline }}{% endblock %}

{% block content %}
    <h1>{{ article.headline }}</h1>

    <p>By {{ article.reporter.full_name }}</p>
    <p>Published at {{ article.pub_date|date:"F j, Y" }}</p>
    <br>
    <p>{{ article.content|linebreaks }}<p>
    <br>
    <p>Go back to <a href="{% url "year" year %}">{{ year }}</a> articles list.</p>
{% endblock %}

Nüüd peaksid nägema 2018. a artikleid aadressil http://127.0.0.1:8000/news/articles/2018/.

Esimene rakendus ongi valmis.