19_2添加新条目

可以添加新主题后,用户肯定还想添加几个新条目

再次定义URL->编写视图函数->模板

i.用于添加新条目的表单

  • 创建一个与模型Entry相关联的表单
  • 这个表单的定制程度高于TopicForm

forms.py

from django import forms
from .models import Topic,Entry

class TopicForm(forms.ModelForm):
     --snip--
class EntryForm(forms.ModelForm):
     --snip--
#新类EntryForm继承了forms.ModelForm
#它包含的Meta类指出了表单基于的模型以及要在表单中包含哪些字段
class EntryForm(forms.ModelForm):
     class Meta:
         model = Entry
         fields = ['text']
         labels = {'text': ' '}
            #这里给字段'text'指定了标签'Entry'
         widgets = {'text': forms.Textarea(attrs={'cols': 80})}
            #通过设置属性widgets来覆盖Django的默认小部件。通过Django使用forms.Textarea定制字段'text'的输入小部件,将文本区域的宽度设置为80列而不是默认的40列。
            #定义属性widgets
            #小部件(widget)-Html表单元素//如单行文本框,多行文本框,下拉列表
            

ii.URL模式new_entry

  • 包含实参topic_id-让条目与特定主题相关联
  • 添加到noways_app/urls.py

urls.py

--snip--
urlpatterns = [
      --snip--
       #用于添加新条目的页面
       path('new_entry/<int:topic_id>/',views.new_entry,
name='new_entry'),
]
#这个url模式与形如http://xxxxx/new_entry/id/的url匹配,其中id是一个与主题ID相匹配的数
代码<int:topic_id>捕获一个数值,并将其赋给变量topic_id
请求的URL与这个模式匹配时,Django将请求和主题ID发送给函数new_entry()

iii.视图函数new_entry()

  • 视图函数new_entry()与函数new_topic()很像
  • 在views.py中添加如下代码

views.py

from django.shortcuts import render,redirect

from .models import Topic
from .forms import TopicForm,EntryForm
--snip--
def new_entry(request,topic_id):
    '''在特定主题中添加新条目,形参topic_id用于存储从URL中获得的值'''
    topic = Topic.objects.get(id=topic_id)
      #渲染页面和处理表单数据时,使用topic_id来获取针对的主题
    if request.method != 'POST'#477
       #未提交数据:创建一个空表单
        form = EntryForm()
    else:
       #POST提交的数据:对数据进行处理
        form = EntryForm(data=request.POST)
          #创建一个EntryForm实例,使用request对象中的POST数据来填充它
        if form.is_valid():#检查条目是否有效
            new_entry = form.save(commit=False)
              #commit=False,让django创建一个新的条目对象,并将其赋给new_entry但不保存到数据库中
            new_entry.topic = topic
              #将new_entry的属性topic设置为函数开头从数据库中获取的主题
            new_entry.save()
               #调用save()且无任何实参。把条目保存到数据库,并将其与正确的主题相关联
            return redirect('noways_app:topic',topic_id=topic_id)
                #调用redirect(重定向到的视图,给视图函数提供的参数)这里要求提供两个参数;
此处重定向到topic(),而这个视图函数需要参数topic_id。视图函数topic()渲染新增条目所属主题的页面,其中的条目列表包含新增的条目
   #显示空表单或指出表单数据无效
   context = {'topic':topic,'form':form}
   return render(request,'noways_app/new_entry.html',context)

iv.模板new_entry

  • 模板new_entry类似于模板new_topic

new_entry.html

{% extends 'noways_app/base.html' %}
{% block content %}
 1.  <p><a href="{% url 'noways_app:topic'topic.id %}">{{topic} }
</a></p>
   <p>新增一个条目:</p>
2.   <form action="{% url 'noways_app:new_entry' topic.id %}"
method='post'>
      {% csrf_topken %}
      {{ form.as_p }}
      <button name='submit'>上传条目</button>
    </form>
 {% endblock content %}
  1. 在页面顶端显示主题,让用户清楚自己处于哪个主题中添加条目,该主题名也是一个链接用于返回到该主题的页面。
  2. 表单的实参action包含url中的topic_id值,让视图函数能够将新条目关联到正确的主题。除此之外基本与模板new_topic.html相同

v.链接到页面new_entry

  • 在显示特定主题的页面中添加到页面new_entry的链接

topic.html

{% extends 'noways_app/base.html' %}
{% block content %}
  <p>主题:{{ topic }}</p>
  <p>条目:</p>
  <p>
    <a href="{% url 'noways_app' topic.id %}">新增一个条目</a>
  </p>
  <ul>
   --snip--
  </ul>
{% endblock content %}

版权声明:
作者:RHZ
链接:https://www.rhzhz.cn/?p=254
来源:RHZ | 用文字记录工作和学习生活
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
19_2添加新条目
可以添加新主题后,用户肯定还想添加几个新条目再次定义URL->编写视图函数->模板 i.用于添加新条目的表单 创建一个与模型Entry相关联的表单这个……
<<上一篇
下一篇>>