Ընդլայնել հավելվածը.
Մենք արդեն ավարտել ենք մեր կայքի ստեղծման համար անհրաժեշտ բոլոր տարբեր քայլերը. Մենք գիտենք, թե ինչպես գրել մոդել, URL, դիտում և ձևանմուշ: Մենք նաև գիտենք, թե ինչպես կարելի է գեղեցիկ դարձնել մեր կայքը:
Պրակտիկայի ժամանակն է:
Բլոգում առաջին բանը, որ մեզ պետք է, հատուկ գրառումներ բացելու էջն է, այնպես չէ՞:
Մենք դեռ ունենք Post
մոդել, ուստի հարկավոր չէ որևէ լրացուցիչ կոդ ավելացնել մեր models.py
ֆայլին:
Ստեղծեք ձևանմուշի հղում դեպի գրառման մանրամասներ
Մենք կսկսենք այս blog/templates/blog/post_list.html
ֆայլի ներսում հղում ավելացնելով: Բացեք այն ձեր կոդերի խմբագրում, և այժմ այն պետք է ունենա այսպիսի տեսք.
blog/templates/blog/post_list.html
{% extends 'blog/base.html' %}
{% block content %}
{% for post in posts %}
<article class="post">
<time class="date">
{{ post.published_date }}
</time>
<h2><a href="">{{ post.title }}</a></h2>
<p>{{ post.text|linebreaksbr }}</p>
</article>
{% endfor %}
{% endblock %}
Մենք կցանկանայինք ցուցակում գրառման վերնագրից (post's title in the post list) հղում ունենալ գրառման մանրամասների (post's detail) էջին: Եկեք փոխենք <h2><a href="">{{ post.title }}</a></h2>
այնպես, որ այն հղվի հաղորդագրության մանրամասն էջին ՝
blog/templates/blog/post_list.html
<h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
toամանակն է բացատրել խորհրդավոր {% url 'post_detail' pk=post.pk %}
: Ինչպես կարող եք ենթադրել, այս {% %}
նշումը նշանակում է, որ մենք օգտագործում ենք Django ձևանմուշի պիտակները/ Django template tags.: Այս անգամ մենք կօգտագործենք այն մեկը, որը մեզ համար URL կստեղծի:
post_detail
մասը նշանակում է, որ Django- ն սպասում է URL- իblog/urls.py
անունով = post_detail
Իսկ ինչ վերաբերում է pk=post.pk
- ին: pk
- ն կարճ բանալին է, որը եզակի նույնացուցիչ է տվյալների բազայում յուրաքանչյուր գրառման համար: Յուրաքանչյուր Django մոդել ունի մի դաշտ, որը ծառայում է որպես իր հիմնական բանալի, և նրա ցանկացած այլ անուն կարող է նաև անվանվել «pk»: Քանի որ մենք չենք սահմանել հատուկ առաջնային բանալի մեր Post
մոդելի մեջ, Django- ն կստեղծի մեկը մեզ համար (անխոս, դա կլինի մի թիվ, որը յուրաքանչյուր հաղորդագրության համար ավելանում է մեկով, ինչպես 1, 2, 3) և այն ավելացնում է pk
անունով դաշտին ՝ մեր յուրաքանչյուր գրառման համար: Մենք մուտք ենք գործում հիմնական բանալին ՝ մուտքագրելով post.pk
, նույն կերպ, ինչպես մուտք ենք գործում այլ դաշտեր (title/վերնագիր
, author/հեղինակ
, etc.) մեր Post/Հրապարակել
օբյեկտ:
Այժմ, երբ մենք գնանք http://127.0.0.1:8000/, մենք կունենանք սխալ (ինչպես սպասվում էր, քանի որ մենք դեռ URL կամ view/դիտում չունենք post_detail
- ի համար): Դա նման տեսք կունենա:
Ստեղծեք URL ՝ post's detail/գրառման մանրամասներ էջի համար
Եկեք urls.py
- ում ստեղծենք URL մեր post_detail
view համար:
Մենք ուզում ենք, որ մեր առաջին հաղորդագրության մանրամասները ցուցադրվեն այս URL - ում ՝ http://127.0.0.1:8000/post/1/
Եկեք blog/urls.py
ֆայլում URL կազմենք ՝ Django- ին ուղղելու համար post_detail
, անունով view/դիտումը-ն , որը ցույց կտա բլոգի մի ամբողջ գրառում: Բացեք blog/urls.py
ֆայլը կոդերի խմբագրում և ավելացրեք այս տողը (path('post/<int:pk>/', views.post_detail, name='post_detail'),
), որպեսզի ֆայլն այսպիսի տեսք ունենա.
blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
]
Այս post/<int:pk>/
մասը նշում է URL- ի օրինակը. Մենք ձեզ կբացատրենք ստորև.
post/
/գրառում նշանակում է, որ URL- ը պետք է սկսվի post բառով, որին կհաջորդի /: Առայժմ ամեն բան կարգին է:<int:pk>
- այս հատվածը ավելի բարդ է: Դա նշանակում է, որ Django- ն ակնկալում է ամբողջ թվային արժեք և այն կփոխանցի view-ին որպեսpk
կոչվող փոփոխական:/
- ապա մեզ պետք է կրկին այս նշանը /, մինչև url- ի ավարտը:
Սա նշանակում է, որ եթե ձեր բրաուզերում մուտքագրեք սա http://127.0.0.1:8000/post/5/
, Django- ն պետք է հասկանա, որ ձեզ հարկավոր է view-ն որը կոչվող է post_detail
, և և փոխանցել այն տեղեկատվությունը, որը pk
հավասար է 5
այս <1>view1>-ում:
Լավ, մենք URL- ի նոր օրինակ ենք ավելացրել blog/urls.py
-ում: Եկեք թարմացնենք էջը ՝ http://127.0.0.1:8000/ Boom! Սերվերը կրկին դադարեցրել է աշխատանքը: Հայացք գցեք կոնսոլին. Ինչպես և սպասվում էր, ևս մեկ սխալ կա:
Հիշու՞մ եք, թե որն է հաջորդ քայլը: Դա view-ի/տեսակետ է ավելացնում:
Ավելացնել հաղորդագրության մանրամասն տեսք/post's detail view
Այս անգամ մեր view-ին/ տեսակետին տրվում է լրացուցիչ պարամետր, pk
. Մեր view-ն պետք է որսա, այնպես չէ՞: Այսպիսով, մենք մեր գործառույթը կսահմանենք որպես def post_detail(request, pk):
. Նկատի ունեցեք, որ այս պարամետրը պետք է ունենա ճիշտ նույն անունը, ինչ որ մենք նշեցինք urls
(pk
) ներսում. Նկատի ունեցեք նաև, որ այս փոփոխականը բաց թողնելը սխալ է և կհանգեցնի սխալի:
Այժմ մենք ուզում ենք ստանալ մեկ և միայն մեկ բլոգային հաղորդագրություն: Դա անելու համար մենք կարող ենք օգտագործել հարցաթերթիկներ, ինչպես հետևյալը.
blog/views.py
Post.objects.get(pk=pk)
Բայց այս ծածկագիրը խնդիր ունի: Եթե primary key
(pk
) -ում (տրված առաջնային բանալում) Post
/գրառում չկա, մենք կունենանք շատ տգեղ սխալ:
Մենք դա չենք ուզում: Բայց բարեբախտաբար, Django- ն շրջանցելու միջոց ունի, որը կկարգավորի դա մեզ համար. get_object_or_404
: Այն դեպքում, երբ չկա Post
/Հաղորդագրություն տրված pk
-ի համար, մենք կստանանք շատ ավելի լավ էջ, որը կոչվում է Page Not Found 404
/ Էջը չի գտնվել):
Լավ նորությունն այն է, որ դուք իրականում կարող եք ստեղծել ձեր սեփական Page not found
/ չգտնված էջը/ և այն դարձնել այնքան գեղեցիկ, որքան ցանկանում եք: Բայց դա հիմա այդքան էլ կարևոր չէ, ուստի մենք այն բաց կթողնենք:
Լավ, ժամանակն է մեր views.py
ֆայլին view /դիտում ավելացնել:
blog/urls.py
- ում մենք ստեղծեցինք URL կանոն post_detail
անունով, որը վերաբերում է views.post_detail
կոչվող դիտմանը: Սա նշանակում է, որ Django- ն blog/views.py
- ի ներսում post_detail
անունով գործառույթ կսպասարկի ներկայացնելու համար:
Ժամանակն է բացել blog/views.py
ֆայլը կոդի խմբագրում և տողերի կողքին ավելացնել from
հետևյալ տողերը.
blog/views.py
from django.shortcuts import render, get_object_or_404
Եվ ֆայլի վերջում մենք կավելացնենք մեր view -ն:
blog/views.py
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
Այո Էջը թարմացնելու ժամանակն է ՝ http://127.0.0.1:8000/
Աշխատում է! Ի՞նչ է պատահում, եթե փորձեք հետևել հաղորդագրության վերնագրի հղմանը:
Օ ոչ! Եվս մեկ սխալ! Բայց մենք արդեն գիտենք, թե ինչպես վարվել դրա հետ, ճիշտ է: Մենք պետք է ձևանմուշ/template ավելացնենք:
Ստեղծեք ձևանմուշի հղում գրառման մանրամասների համար
Մենք blog/templates/blog
-ում կստեղծենք ֆայլ, որը կոչվում է post_detail.html
, և կբացենք այն կոդերի խմբագրում:
Մուտքագրեք հետևյալ ծածկագիրը.
blog/templates/blog/post_detail.html
{% extends 'blog/base.html' %}
{% block content %}
<article class="post">
{% if post.published_date %}
<time class="date">
{{ post.published_date }}
</time>
{% endif %}
<h2>{{ post.title }}</h2>
<p>{{ post.text|linebreaksbr }}</p>
</article>
{% endblock %}
Կրկին մենք երկարացնում ենք base.html
- ը: content
(բովանդակություն) բլոկում մենք ցուցադրում ենք հրապարակման ամսաթիվը (եթե գոյություն ունի հրապարակված_ թվականը), վերնագիրն ու տեքստը: Բայց մենք պետք է քննարկենք մի քանի կարևոր բաներ, ճիշտ է՞:
No translations matched your search {% if ... %} ... {% endif %}
- ը ձևանմուշի պիտակ է, որը մենք կարող ենք օգտագործել, եթե ինչ-որ բան փորձելու կարիք ունենանք: (Հիշո՞ւմ եք եթե ... if... կառուցվածքը Python- ի «Ներածություն» գլխից:) Այս բաժնում մենք ուզում ենք ստուգել, թե արդյոք մեր գրառման <code>published_date
-ն /հրապարակված_թվականը պարունակում է տվյալներ, թե ոչ:
Լավ, մենք կարող ենք թարմացնել մեր էջը և տեսնել, թե արդյո՞ք TemplateDoesNotExist
- ը այլևս չկա:
Այո դա աշխատում է:
Տեղակայման ժամանակն է:
Լավ կլինի ստուգել, որ կայքը դեռ աշխատում է PythonAnywhere- ում, ճիշտ չէ՞: Եկեք նորից կատարենք տեղակայումը:
command-line
$ git status
$ git add .
$ git status
$ git commit -m "Added view and template for detailed blog post as well as CSS for the site."
$ git push
Հետո, PythonAnywhere Bash console-ում:
PythonAnywhere command-line
$ cd ~/<your-pythonanywhere-domain>.pythonanywhere.com
$ git pull
[...]
(Հիշեք, որ <your-pythonanywhere-domain>
- ը փոխարինեք ձեր PythonAnywhere օգտվողի անունով, առանց չակերտների (անկյունային փակագծերի:)
Ստատիկ ֆայլերի թարմացվումը սերվերում
Python- ի նման սերվերները ցանկացած այլ վայրում սիրում են ստեղծել «ստատիկ ֆայլեր» (օրինակ ՝ CSS ֆայլեր) Python ֆայլերից առանձին, քանի որ դրանք կարող են օպտիմալացնել, որպեսզի դրանք ավելի արագ բեռնվեն: Արդյունքում, ամեն անգամ, երբ մենք փոփոխություններ ենք կատարում մեր CSS ֆայլերում, մենք պետք է սերվերի վրա գործադրենք լրացուցիչ հրաման ՝ ասելու, որ դրանք թարմացնի: Հրամանը կոչվում է collectstatic
:
Սկսեք ակտիվացնելով ձեր virtualenv- ը, եթե այն արդեն ակտիվ չէ (PythonAnywhere- ը դրա համար օգտագործում է workon
կոչվող հրամանը, սա նույնն է, ինչ source myenv/bin/activate
հրամանը, որը դուք օգտագործում եք ձեր սեփական համակարգչում ):
PythonAnywhere command-line
$ workon <your-pythonanywhere-domain>.pythonanywhere.com
(ola.pythonanywhere.com)$ python manage.py collectstatic
[...]
manage.py collectstatic
հրամանը փոքր-ինչ նման է < manage.py migrate
-ին: Մենք որոշ փոփոխություններ ենք կատարում մեր կոդի մեջ, այնուհետև ասում ենք, որ Django- ն apply / <0>կիրառի0> այդ փոփոխությունները սերվերում կամ տվյալների բազայում ստատիկ ֆայլերի հավաքածուի մեջ:
Ամեն դեպքում, մենք այժմ պատրաստ ենք անցնել "Web" page / <0>«Վեբ» էջ0> (վահանակի վերևի աջ անկյունում գտնվող կոճակի ընտրացանկից) և կտտացնել Reload / <1>Վերաբեռնել1>, և այնուհետև անցնել այս հղումով https: // page subdomain.pythonanywhere.com արդյունքը տեսնելու համար:
Այսքանը: Դու արեցիր դա!