Rozšíření tvé aplikace
Dokončily jsme již všechny kroky potřebné k vytvoření našeho webu: víme, jak napsat model, url, view a šablonu. Víme také, jak udělat naše webové stránky pěkné.
Čas na procvičení!
První věc, kterou potřebujeme v našem blogu, je pochopitelně stránka, která zobrazí jeden příspěvek, že ano?
Již máme Post
model, takže nebudeme muset přidávat nic k models.py
.
Vytvoření šablony odkazu na post detail
Začneme s přidáním odkazu do blog/templates/blog/post_list.html
souboru. Zatím by měl vypadat takto:
{% extends 'blog/base.html' %}
{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
{% endblock %}
Chceme mít odkaz ze seznamu příspěvků na stránku detail příspěvku. Změňme < h1 >< href ="">{{ post.title }}< /a></h1>
tak, aby odkazoval na stránku detailu příspěvku:
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
Čas k vysvětlení tajemného {% url 'post_detail' pk=post.pk %}
. Jak asi tušíš, {% %}
tato notace znamená, že používáme Django šablonovací značky. Tentokrát použijeme jednu, která pro nás vytvoří adresu URL.
blog.views.post_detail
je cesta k post_detail
view, který chceme vytvořit. Poznámka: blog
je název naší aplikace (adresář blog
), views
je jméno ze souboru, views.py
a poslední kousek - post_detail
- je název view.
Teď, když půjdeme na: http://127.0.0.1:8000/, dostaneme chybu (což očekáváme, protože nemáme adresu URL nebo view pro post_detail
). View bude vypadat takto:
Vytváříme adresu URL na detail příspěvku
Pojďme vytvořit adresu URL v urls.py
pro náš post_detail
view!
Chceme, aby se detail našeho prvního příspěvku zobrazil na této URL: http://127.0.0.1:8000/post/1/
Pojďme vytvořit adresu URL v souboru blog/urls.py
odkazující Django na view s názvem post_detail
, který bude zobrazovat celý příspěvek blogu. Přidej řádek url (r'^post/(?)P< pk>[0-9]+)/$', views.post_detail, name='post_detail'),
do souboru blog/urls.py
. Tento soubor by měl vypadat takto:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.post_list, name='post_list'),
url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
]
Tato část ^post/(?)P<pk>[0-9] +)/$
vypadá děsivě, ale bez obav - my ti to vysvětlíme: - začíná to ^
– "to znamená začátek řetězce" - post/
znamená pouze to, že po začátku by adresa URL měla obsahovat slovo post a /. Zatím dobré. - (?P<pk>[0-9]+)
- Tato část je složitější. Znamená to, že Django vezme vše, co zde bude umístěné, a přesune to do view do proměnné s názvem pk
. [0-9]
nám také říká, že to může být pouze číslo, ne písmeno (takže cokoliv mezi 0 a 9). +
znamená, že je zde má být jedna nebo více číslic. Takže něco jako http://127.0.0.1:8000/post //
není platné URL, ale http://127.0.0.1:8000/post/1234567890/
je naprosto v pořádku! -/
- pak potřebujeme / znovu znak / - $
- znamená "konec" řetězce!
Znamená to, že pokud zadáte http://127.0.0.1:8000/post/5/
do prohlížeče, Django pochopí, že hledáte view s názvem post_detail
a přenese informaci, že pk
se rovná 5
do view.
pk
je zkratka pro primární klíč
. Tento název se často používá v Django projektech. Ale můžeš si své proměnné pojmenovat jak chceš (nezapomeň: malá písmena a _
namísto mezer!). Například namísto (?. P <pk>[0-9]+)
máme proměnnou post_id
, takže tento kousek pak vypadá takto: (?P< post_id> [0-9]+)
.
OK, přidaly jsme nový vzor adresy URL do blog/urls.py
! Musíme obnovit stránku: http://127.0.0.1:8000/. Ještě další chyba, jak jsme čekaly!
Pamatuješ si, jaký je další krok? Jistě: Přidat view!
Přidání view pro detail příspěvku
Tentokrát má náš view uveden dodatečný parametr pk
. Náš view potřebuje tento parametr zachytit, že? Takže definujeme naši funkci jako def post_detail (request, pk):
. Všimni si, že musíme použít přesně stejný název jako ten, který jsme určili v URL (pk
). Vynechání této proměnné je nesprávné a bude mít za následek chybu!
A teď chceme dostat jeden a pouze jeden příspěvek z blogu. K tomu můžeme použít querysets jako je tento:
Post.objects.get(pk=pk)
Ale tento kód má problém. Pokud neexistuje žádný Post
s primárním klíčem
(pk
), dostaneme velice nepěknou chybu!
A to my nechceme! Ale samozřejmě Django přichází s něčím, co nám to pomůže ošetřit za nás: get_object_or_404
. V případě, že neexistuje žádný Post
s daným pk
, zobrazí se mnohem hezčí stránka (nazývaná Page Not Found 404
).
Dobrou zprávou je, že můžeš skutečně vytvořit vlastní stránku Page Not Found 404
a udělat ji tak pěkně, jak jen chceš. Ale to teď není tak důležité, takže to přeskočíme.
Ok, čas k přidání view do našeho souboru views.py
!
Měla bys otevřít blog/views.py
a přidat následující kód:
from django.shortcuts import render, get_object_or_404
Poblíž jiné řádky from
. A na konec souboru přidáme náš view:
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
Ano. Je na čase aktualizovat stránku: http://127.0.0.1:8000 /
Fungovalo to! Ale co se stane, když klepneš na odkaz v názvu příspěvku?
Ach ne! Další chyba! Ale my už víme, jak s tím naložit správně. Musíme přidat šablonu.
Vytvoření šablony pro detail příspěvku
Vytvoříme soubor blog/templates/blog
s názvem post_detail.html
.
Celý příkaz bude vypadat takto:
{% extends 'blog/base.html' %}
{% block content %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endblock %}
Opět rozšiřujeme base.html
. V bloku content
chceme zobrazit published_date příspěvku (pokud existuje), název a text. Ale měli bychom probrat některé důležité věci.
{% if ... %} ... {% endif %}
je značka šablony, kterou můžeme použít, když chceme něco zkontrolovat (nezapomeň , if... else...
v kapitole Úvod do Pythonu?). V tomto případě chceme zjistit, jestli published_date
příspěvku není prázdný.
OK, teď můžeme aktualizovat naše stránky a uvidíš, jestli Page Not Found
je pryč.
Hurá! Funguje to!
Ještě jedna věc: čas nasadit aplikaci!
Bylo by dobré zjistit, jestli naše webové stránky budou stále fungovat na PythonAnywhere. Zkusme je znovu nasadit.
$ git status
$ git add --all .
$ git status
$ git commit -m "Added view and template for detailed blog post as well as CSS for the site."
$ git push
- Pak v Bash konzoli PythonAnywhere:
$ cd my-first-blog
$ source myvenv/bin/activate
(myvenv)$ git pull
[...]
(myvenv)$ python manage.py collectstatic
[...]
- Nakonec jdi na kartu Web a klikni na Reload.
A mělo by to být! Gratulujeme :)