天天看點

python web小項目實踐 用的Django (二)

再建立幾個頁面,把搞到的資料展示出來

網頁模闆繼承:網頁有些共用的部分,這個就抽離出來,避免寫重複代碼

在index.html所在的目錄下,再建立一個base.html

base.html

<p>
	<a href = "{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}
           

再把之前的index.html改一下

index.html

{% extends "learning_logs/base.html" %}
{% block content %}
	<p>Learning Log helps you keep track of your learning, for any topic you're learning about.<p>
{% endblock content %}
           

先搞個顯示Topics的頁面

首先改learning_logs/url.py

"""定義learning_logs的URL模式"""
from django.conf.urls import url
from . import views

urlpatterns = [
    # 首頁
    url(r'^$', views.index, name='index'),
    # 顯示所有的主題
    url(r'^topics/$', views.topics, name='topics'),
]
           

新加了個路徑比對我們的新的函數方法(沒有編寫呢),再修改views.py

from django.shortcuts import render
from .models import Topic
# Create your views here.


def index(request):
    """學習筆記的首頁"""
    return render(request, 'learning_logs/index.html')


def topics(request):
    """顯示所有主題"""
    topics = Topic.objects.order_by('date_added')
    # 這裡定義了一個将要發送給模闆的上下文,是一個字典,其中的鍵在模闆中将用來通路資料
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)
           

就差個接收資料的頁面了

topic.html,跟那幾個頁面放一起

{% extends "learning_logs/base.html" %}
{% block content %}
	<p>Topics</p>
	<ul>
		{% for topic in topics %}
			<li>{{topic}}</li>
		{% empty %}
			<li>No topics have been added yet.</li>
		{% endfor %}
	</ul>
{% endblock content %}
           

再改動下base.html讓父模闆中包含直接跳轉Topic這個頁面的a标簽

<p>
	<a href = "{% url 'learning_logs:index' %}">Learning Log</a> - 
	<a href = "{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}
           

效果如圖

python web小項目實踐 用的Django (二)
python web小項目實踐 用的Django (二)

現在要把Chess也變成能點選的,顯示具體的内容(一個新頁面)

先在learning_logs/urls.py中增加url

"""定義learning_logs的URL模式"""
from django.conf.urls import url
from . import views

urlpatterns = [
    # 首頁
    url(r'^$', views.index, name='index'),
    # 顯示所有的主題
    url(r'^topics/$', views.topics, name='topics'),
    # 特定主題的詳細頁面
    url(r'^topics/(? P<topic_id>\d+)/$', views.topic, name='topic'),
]
           

還得去views.py裡添加個方法

from django.shortcuts import render
from .models import Topic
# Create your views here.


def index(request):
    """學習筆記的首頁"""
    return render(request, 'learning_logs/index.html')


def topics(request):
    """顯示所有主題"""
    topics = Topic.objects.order_by('date_added')
    # 這裡定義了一個将要發送給模闆的上下文,是一個字典,其中的鍵在模闆中将用來通路資料
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)


def topic(request, topic_id):
    """顯示單個主題及其所有的條目"""
    topic = Topic.objects.get(id=topic_id)
    # date_added前邊的減号是按降序排列的意思
    entries = topic.entry_set.order_by('-date_added')
    context = {'topic': topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)
           

date_added前邊的減号是按降序排列的意思

然後寫個topic.html放在一起

{% extends "learning_logs/base.html" %}
{% block content %}
	<p>Topic:{{topic}}</p>
	<p>Entries:</p>
	<ul>
	{% for entry in entries %}
		<li>
			<p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
			<!--linebreaks将包含換行符的長條目轉換為浏覽器能夠了解的格式,以免顯示為一個不間斷的文本塊-->
			<p>{{ entry.text|linebreaks }}</p>
		</li>
	{% empty %}
		<li>There are no entries for this topic yet.</li>
	{% endfor %}
	</ul>
{% endblock content %}
           

還得修改topics.html中的一些内容

{% extends "learning_logs/base.html" %}
{% block content %}
	<p>Topics</p>
	<ul>
	{% for topic in topics %}
		<li>
			<a href="{% url 'learning_logs:topic' topic.id %}" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >{{ topic }}</a>	
		</li>
	{% empty %}
		<li>No topics have been added yet.</li>
	{% endfor %}
	</ul>
{% endblock content %}
           

然後再打開頁面就能看效果了,如下:

python web小項目實踐 用的Django (二)
python web小項目實踐 用的Django (二)
python web小項目實踐 用的Django (二)

我在這裡其實碰到了幾個坑爹問題主要是自己寫錯了,報的錯誤也不準,

大家注意下第一處:

topics.html中<a href="{% url 'learning_logs:topic' topic.id %}" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >{{ topic }}</a>    這句話應該是learning_logs:topic冒号,結果我寫成了learning_logs/topic

第二處:

learning_logs裡的urls.py

"""定義learning_logs的URL模式"""
from django.urls import path

from . import views

urlpatterns = [
    # 首頁
    path('', views.index, name='index'),
    # 顯示所有的主題
    path('topics/', views.topics, name='topics'),
    # 特定主題的詳細頁面
    path('topics/<int:topic_id>/', views.topic, name='topic'),
]
           

django2版本和1有差別,2用path,更加簡化比對路徑,1用的url,當然2用url也可以的好像是

第三處:

views.py裡面def topic(request, topic_id):這裡我少寫個參數,導緻在控制台上列印什麼gbk錯誤,那個錯誤它報的不對,我修改了learning_log\ll_env\Lib\site-packages\django\views裡面的debug.py裡面的

python web小項目實踐 用的Django (二)

第331行,加了utf-8編碼,然後發現了錯誤原因是topic() got an unexpected keyword argument 'topic_id'才發現少寫了個參數

請繼續看第三部分,使用者部分以及相關操作和安全