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)
View Code

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" 内容块 -->
View Code

 

  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})}
View Code

 

'''
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)
View Code

 

  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" 内容块 -->
View Code

 

  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)
View Code

 

  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 %}
View Code

 

  4 入口按钮

1 添加代码: 页面入口

<p>
  <a href="{% url 'learning_logs:edit_entry' entry.id %}"> Edit entry </a>
</p>

 

  5 页面显示

1 入口按钮

 

1 编辑页面。

 

四: 完整code 

    压缩包: 链接

posted @ 2023-06-11 20:27  火焰马  阅读(2)  评论(0编辑  收藏  举报