(Django)19.1.1添加新主题

本节目的:能够添加新主题.

方法和前面几乎一样:定义URL,编辑视图函数,编写一个模板。一个主要的差别便在需要导入包含表单的模块forms.py。

1.用于添加主题的表单

我们使用ModelForm创建表单,它根据我们在第18章定义的模型中的信息自动创建表单。

在models.py同级目录下创建forms.py。

froms.py

from django import forms

from .models import Topic, Entry

class TopicForm(forms.ModelForm):  #继承forms.ModelForm
    # 包含的类Meta指出表单基于的模型和在表单中包含的字段,如本例中的text
    class Meta:
        model = Topic  #根据Topic模型创建一个表单
        fields = ['text']  #该表单只包括字段text
        labels = {'text': ''}  #不为字段text生成标签

2.URL模式new_topic

http://localhost:8000/new_topic/

learning_logs/urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    --snip--
    
    # Page for adding a new entry.
    url(r'^new_entry/(?P\d+)/$', views.new_entry, name='new_entry'),
]

3.视图函数new_topic()

实现:进入new_topic网站,显示表单;对提交的表单进行处理,并重定向到网页topics。

views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

from .models import Topic
from .forms import TopicForm

--snip--

@login_required
def new_topic(request):
    """Add a new topic."""
    # 确定请求的方法是POST,如果不是,那么可能是GET,因此我们需要返回一个空的表单。
    if request.method != 'POST':
        # 没有提交数据,创建一个新的表单
        form = TopicForm()  # 创建一个TopicForm()实例
                            
    else:
        form = TopicForm(request.POST)  
        # 检查信息是否有效,根据models.py中定义
        if form.is_valid():
            # 传递commit=False,让Django创建一个新的条目对象,并且把它存储到new_topic中
            new_topic = form.save(commit=False)
            # 将数据保存到数据库中
            new_topic.save()
            # 重定向到主页
            return HttpResponseRedirect(reverse('learning_logs:topics'))
    # 将表单通过字典发送给模板
    # 将表单发送给模板,如果实例化TopicForm时没有指定参数,Django会创建一个可供用户填写的空表单
    context = {'form': form}
    return render(request, 'learning_logs/new_topic.html', context)

4.模板new_topic

new_topic.html

{% extends "learning_logs/base.html" %}  

{% block content %}

  

Add a new topic:

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

5.topics中链接到new_topic:

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

Topics

    --snip--
Add new topic {% endblock content %}

 

你可能感兴趣的:(Django)