二 Django入门( 四 )


然后还是检查请求方法是POST还是GET 。如果是GET请求 , 将创建一个空的实例 。如果请求方法为POST , 我们就对数据进行处理:创建一个实例 , 使用对象中的POST数据来填充它;再检查表单是否有效 , 如果有效则设置条目对象的属性topic , 再将条目对象保存到数据库 。
在调用save()时 , 传递了实参=False , 让创建一个新的条目对象 , 并将其存储到中 , 但不将它保存到数据库中 。我们将的属性topic设置为在这个函数开头从数据库中获取的主题 , 然后调用save() , 且不指定任何实参 。这将把条目保存到数据库 , 并将其与正确的主题相关联 。
最后 , 将用户重定向到显示相关主题的页面 。调用()时 , 需要提供两个实参:要根据它来生成URL的URL模式的名称;列表args  , 其中包含要包含在URL中的所有实参 。
模板与模板也比较类似 。
# vim learning_logs/templates/learning_logs/new_entry.html
{% extends "learning_logs/base.html" %}{% block content %}{{ topic }}
Add a new entry:

{% csrf_token %}{{ form.as_p }}{% endblock content %}

首先继承base.html 。接着在页面顶端显示了主题 , 让用户知道是在哪个主题中添加条目;该主题名也是一个链接 , 可用于返回该主题的主页面 。
表单的实参 包含URL中的值 , 让视图函数能够将新条目关联到正确的主题 。除此之外 , 这个模板与模板.html完全相同 。
# vim learning_logs/templates/learning_logs/topic.html
{% extends 'learning_logs/base.html' %}{% block content %}Topic: {{ topic }}
Entries:
add new entry
    {% for entry in entries %}
  • {{ entry.date_added|date:'M d, Y H:i' }}
    {{ entry.text|linebreaks }}
  • {% empty %}
  • There are no entries for this topic yet.
  • {% endfor %}
{% endblock content %}

在显示条目前添加链接 , 因为在这种页面中 , 执行的最常见的操作是添加新条目 。
编辑条目
下面来创建一个页面 , 让用户可以编辑既有的条目 。
二  Django入门

文章插图
# vim learning_logs/urls.py
"""定义learning_logs的URL模式"""from django.urls import path, re_pathfrom . import viewsapp_name='learning_logs'urlpatterns = [# 主页path('', views.index, name='index'),# 显示所有的主题path('topics/', views.topics, name='topics'),# 特定主题的详细页面re_path(r'^topics/(?P\d+)/$', views.topic, name='topic'),# 用于添加新主题的页面path('new_topic/', views.new_topic, name='new_topic'),# 用于添加新条目的页面re_path(r'^new_entry/(?P\d+)/$', views.new_entry, name='new_entry'),# 用于编辑条目的页面re_path(r'^edit_entry/(?P\d+)/$', views.edit_entry, name='edit_entry'),]
在URL(如:8000//1/)中传递的ID存储在形参中 。这个URL模式将预期匹配的请求发送给视图函数() 。