(Django)19.1.2添加新条目

除了添加新的主题,我们也可以添加新的条目。为此我们需要在forms.py中添加一个新的类。

 

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

forms.py

from django import forms
from .models import Topic, Entry
class TopicForm(forms.ModelForm):
    --snip--

class EntryForm(forms.ModelForm):
    class Meta:
        model = Entry
        fields = ['text']  #只包含字段text
        labels = {'text': ''}  #给字段text指定了一个空的标签
        widgets = {'text': forms.Textarea(attrs={'cols': 80})} # 定义属性widgets

定义属性widgets,其是一个HTML表单元素,如单行文本框、多行文本区域或下拉列表。通过设置属性widgets,可覆盖Django的默认小部件。通过使用forms.Textarea,定制了字典‘text’的输入小部件,将文本区域的宽度设置为80列而不是默认的40列。

2.URL模式new_entry

learning_logs/urls.py

http://localhost:8000/new_entry/ id/

from django.conf.urls import url
from . import views
urlpatterns = [
    --snip--
    # ?P<topic_id> 捕获一个数值,并且将其保存在变量topic_id中
    # 当请求的URL与这个模式匹配时,Django将请求和主题ID发送给new_entry()中
    url(r'^new_entry/(?P<topic_id>\d+)/$', views.new_entry, name='new_entry'),
]

3.视图函数new_entry()

views.py

from django.shortcuts import render
--snip--

from .models import Topic
from .forms import TopicForm, EntryForm

--snip--

def new_entry(request, topic_id):
    # 使用topic_id获取正确的主题
    topic = Topic.objects.get(id=topic_id)
    
    if request.method != 'POST':
        form = EntryForm()        
    else:
        form = EntryForm(data=request.POST)
        if form.is_valid():
            new_entry = form.save(commit=False)
            new_entry.topic = topic
            new_entry.save()
            # 调用reverse时,需要提供两个实参:要根据它来生成URL。列表args,其中包含要包含在URL中所有实参。
            return HttpResponseRedirect(reverse('learning_logs:topic',args=[topic_id]))
    
    # 向网页传递参数
    context = {'topic': topic, 'form': form}
    return render(request, 'learning_logs/new_entry.html', context)

4.模板new_entry.html

new_entry.html

{% extends "learning_logs/base.html" %}
{% block content %}
  <!--我们在页面的顶端显示了主题,以告诉用户其所在主题。同时它也是一个链接,可用于返回该主题的主页面-->
  <p><a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a></p>  
  <p>Add a new entry:</p>
  <!--!--定义一个HTML表单,实参aciton告诉要把提交的表单的发送到哪里,我们将它返回视图函数new_entry(),实参method让浏览器使用POST方法提交数据-->
  <form action="{% url 'learning_logs:new_entry' topic.id %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <button name='submit'>add entry</button>
  </form>
    
{% endblock content %}

5.链接到页面new_entry

topic.html

{% extends 'learning_logs/base.html' %}
{% block content %}

  <p>Topic: {{ topic }}</p>

  <p>Entries:</p>
  <!-- link to the page of new_entry -->
  <p>
      <a href="{% url 'learning_logs:new_entry' topic.id %}">add new entry</a>
  </p>
  <ul>
    --snip--
  </ul>

{% endblock content %}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值