刚学Python,按着书里的代码弄Django项目时虽然可以正常运行,但是一直搞不明白里面的某个参数是怎么传递的,书里也写的不明白,上网查都是复制粘贴书里的内容,今天runserver反复在浏览器和shell里面测试,终于搞懂了,其实还是因为不了解HTML,希望能给同样困扰的小伙伴们一点启示。
"""定义learning_logs的URL模式"""
urlpatterns = [
# 主页
url(r'^$',views.index,name='index'),
# 显示所有的主题
url(r'^topics/$',views.topics,name='topics'),
# 特定主题的详细页面
url(r'^topics/(?P\d+)/$' ,views.topic,name='topic'),
url(r'^new_topic/$',views.new_topic,name='new_topic'),
url(r'^new_entry/(?P\d+)/$' ,views.new_entry,name='new_entry'),
]
其中url(r’^topics/$’,views.topics,name=‘topics’)不需要指定ID,直接导向视图函数topics。
def topics(request):
"""显示所有主题"""
topics = Topic.objects.order_by('date_added')
context = {
'topics' : topics}
return render(request,'learning_logs/topics.html',context)
其中变量topics = Topic.objects.order_by(‘date_added’)存储了所有主题项目,并通过context渲染到topics.html。
{
% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{
{
topic }}</a>
</li>
遍历变量topics中的项目并创建到对应主题的链接,其中提供了实参topic.id即遍历时每个主题的ID,生成的链接样式如http://127.0.0.1:8000/topics/1/
上文urls.py里 url(r’^topics/(?P
views.py部分代码:
def topic(request,topic_id):
"""显示单个主题及其所有的条目"""
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {
'topic' : topic,'entries' : entries}
return render(request,'learning_logs/topic.html',context)
topic = Topic.objects.get(id=topic_id),此时topic_id用来获取特定主题,最后完成渲染页面
从所有主题页面点击特定主题并显示,其中主题ID的传递流程:
视图函数topics获取所有主题然后渲染到topics.html
topics.html遍历所有主题并获取每个主题的id,存储到变量topic.id,同时生成如下格式的链接http://127.0.0.1:8000/topics/1/
访问topics.html每个主题链接时,通过url模式捕获topic.id存储到变量topic_id再传递给视图函数topic
视图函数topic渲染指定主题的页面