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.