004_页面操作标题和内容
/* 一: 标题 1 创建表单 2 url 3 views 4 模板 5 入口按钮 6 页面显示 二: 内容 1 创建表单 2 url 3 views 4 模板 5 入口按钮 6 页面显示 三: 编辑内容 1 url 2 views 3 模板 4 入口按钮 5 页面显示 四: 完整code */
一: 标题
1 创建表单
1 创建文件: forms.py
2 添加code。
from django import forms from .models import Topic class TopicForm(forms.ModelForm): class Meta: model = Topic fields = ['text'] labels = {'text': ''}
''' class TopicForm(forms.ModelForm): 继承自 forms.ModelForm。ModelForm是一个特殊表单类型,它可以自动根据一个给定的模型创建表单。 class Meta::这是 TopicForm 类的一个内部类,根据那个模型创建表单。 model = Topic:这个表单是基于 Topic 模型的。Django 会根据 Topic 模型的字段自动创建表单字段。 fields = ['text']:表单中包含哪些字段。这表单只包含 Topic 模型的 text 字段。 labels = {'text': ''}:定义表单字段的标签。这个text字段的标签被设置为一个空字符串,这意味着在渲染表单时,text 字段旁边不会显示任何标签。 '''
2 url
urlpatterns = [ # ... # 添加新主题的页面 path('new_topic/', views.new_topic, name='new_topic'), ]
1 添加新的url。
3 views
# 较多注释 def new_topic(request): ''' 添加主题 ''' if request.method != 'POST': # 如果请求方法不是POST,即用户初次访问页面,我们创建一个新的空表单 form = TopicForm() else: # 如果请求方法是POST,即用户已经填写了表单并点击了提交按钮,我们使用用户提交的数据创建一个表单实例 form = TopicForm(data=request.POST) if form.is_valid(): # 如果表单数据有效,我们保存表单数据到数据库 form.save() # 然后重定向用户到主题列表页面 return redirect('learning_logs:topics') # 如果请求方法不是POST,或者表单数据无效,我们创建一个上下文,将表单实例作为上下文的一部分 context = {'form': form} # 然后我们渲染模板,将上下文传递给模板,模板会使用上下文中的数据来生成HTML return render(request, 'learning_logs/new_topic.html', context)
1 添加视图函数: new_topic(request)
4 模板
1 创建文件: new_topic.html
<!-- 注释版 --> {% extends "learning_logs/base.html" %} <!-- 继承基础模板 --> {% block content %} <!-- 开始一个名为 "content" 的内容块 --> <p>Add a new topic:</p> <!-- 显示一段提示文本 --> <!-- 开始一个表单,当用户提交表单时,数据会被发送到 'learning_logs:new_topic' 的 URL --> <form action="{% url 'learning_logs:new_topic' %}" method='post'> {% csrf_token %} <!-- 添加 CSRF 令牌以防止跨站请求伪造攻击 --> {{ form.as_p }} <!-- 将表单渲染为一系列带有 <p> 标签的段落 --> <button name="submit">Add topic</button> <!-- 添加一个提交按钮 --> </form> {% endblock content %} <!-- 结束 "content" 内容块 -->
5 入口按钮
1 添加代码: 页面入口
<a href="{% url 'learning_logs:new_topic' %}">Add a new topic</a>
6 页面显示
1 入口按钮
1 标题添加
二: 内容
1 创建表单
1 添加code。
from .models import Topic, Entry class EntryForm(forms.ModelForm): class Meta: model = Entry fields = ['text'] labels = {'text': ''} widgets = {'text':forms.Textarea(attrs={'cols':80})}
''' widgets = {'text':forms.Textarea(attrs={'cols':80})}: 这行代码定义了表单字段的小部件。在这个例子中,text 字段的小部件被设置为一个文本区域(Textarea),并且这个文本区域的列数(cols)被设置为 80。 '''
2 url
urlpatterns = [ # 添加新内容的页面 path('new_entry/<int:topic_id>/', views.new_entry, name='new_entry'), ]
1 添加新的url。
3 views
# 注释加强版 def new_entry(request, topic_id): # 定义视图函数 new_entry,它接收两个参数:一个 request 对象和一个 topic_id ''' 在指定的标题里添加内容 ''' topic = Topic.objects.get(id=topic_id) # 从数据库中获取 ID 为 topic_id 的 Topic 对象 if request.method != 'POST': # 检查这次请求的方法是否为 'POST' # 如果不是(也就是说,这是一个 'GET' 请求),创建一个新的空表单 form = EntryForm() else: # 如果请求方法是 'POST'(也就是说,用户已经填写了表单并提交了数据) # 创建一个新的 EntryForm 实例,并将提交的数据传给了表单 form = EntryForm(data=request.POST) if form.is_valid(): # 检查表单数据是否有效 new_entry = form.save(commit=False) # 创建一个新的 Entry 对象,但是还不保存到数据库 new_entry.topic = topic # 将新条目的 topic 属性设置为当前主题 new_entry.save() # 将新条目保存到数据库 return redirect('learning_logs:topic', topic_id=topic_id) # 数据保存后,重定向用户到 'learning_logs:topic' 视图 # 创建一个上下文字典,用于传递数据给模板 context = {'topic': topic, 'form': form} # 渲染模板,并返回一个 HttpResponse 对象 return render(request, 'learning_logs/new_entry.html', context)
4 模板
1 创建文件: new_topic.html
{% extends "learning_logs/base.html" %} <!-- 继承基础模板 --> {% block content %} <!-- 开始一个名为 "content" 的内容块 --> <!-- 创建一个链接,链接的 URL 是 'learning_logs:topic' 视图的 URL,同时传递 topic.id 作为参数 --> <p> <a href="{% url 'learning_logs:topic' topic.id %}"> {{ topic}} </a> </p> <!-- 显示一段提示文本 --> <p>Add a new entry: </p> <!-- 开始一个表单,当用户提交表单时,数据会被发送到 'learning_logs:new_entry' 的 URL,同时传递 topic.id 作为参数 --> <form action="{% url 'learning_logs:new_entry' topic.id %}" method='post'> {% csrf_token %} <!-- 添加 CSRF 令牌以防止跨站请求伪造攻击 --> {{ form.as_p }} <!-- 将表单渲染为一系列带有 <p> 标签的段落 --> <button name="submit">Add entry </button> <!-- 添加一个提交按钮 --> </form> {% endblock content %} <!-- 结束 "content" 内容块 -->
5 入口按钮
1 添加代码: 页面入口
<p> <a href="{% url 'learning_logs:new_entry' topic.id %}"> Add new entry</a> </p>
6 页面显示
1 入口按钮
1 内容添加
三: 编辑内容
1 url
urlpatterns = [ # 编辑内容 path('edit_entry/<int:entry_id>', views.edit_entry, name='edit_entry'), ]
1 添加新的url。
2 views
def edit_entry(request, entry_id): ''' 编辑内容 ''' entry = Entry.objects.get(id=entry_id) # 从数据库中获取 ID 为 entry_id 的 Entry 对象 topic = entry.topic # 获取这个条目所属的主题 if request.method != 'POST': # 检查这次请求的方法是否为 'POST' # 如果不是(也就是说,这是一个 'GET' 请求),创建一个新的 EntryForm 实例,并用当前条目的数据填充表单 form = EntryForm(instance=entry) else: # 如果请求方法是 'POST'(也就是说,用户已经编辑了表单并提交了数据) # 创建一个新的 EntryForm 实例,并将提交的数据和当前条目的实例传给了表单 form = EntryForm(instance=entry, data=request.POST) if form.is_valid(): # 检查表单数据是否有效 form.save() # 如果表单数据有效,保存表单的更改到数据库 # 数据保存后,重定向用户到 'learning_logs:topic' 视图,同时传递 topic.id 参数 return redirect('learning_logs:topic', topic_id=topic.id) # 创建一个上下文字典,用于传递数据给模板 context = {'entry': entry, 'topic': topic, 'form': form} # 渲染模板,并返回一个 HttpResponse 对象 return render(request, 'learning_logs/edit_entry.html', context)
3 模板
1 创建文件: edit_entry.html
{% extends "learning_logs/base.html" %} {% block content %} <p> <a href="{% url 'learning_logs:topic' topic.id %}"> {{ topic}}</a></p> <p>Edit entry:</p> <form action="{% url 'learning_logs:edit_entry' entry.id %}" method='post'> {% csrf_token %} {{ form.as_p}} <button name="submit">Save changes</button> </form> {% endblock content %}
4 入口按钮
1 添加代码: 页面入口
<p> <a href="{% url 'learning_logs:edit_entry' entry.id %}"> Edit entry </a> </p>
5 页面显示
1 入口按钮
1 编辑页面。
四: 完整code
压缩包: 链接