Django项目——使用表单添加数据

一 代码 

1 learning_logs/forms.py

# -*- coding: utf-8 -*-
# 导入模块 forms 以及要使用的模型 Topic,Entry
from django import forms

from .models import Topic, Entry

'''
定义了一个名为 TopicForm 的类,它继承了 forms.ModelForm
最简单的 ModelForm 版本只包含一个内嵌的 Meta 类,它告诉 Django 根据哪个模型创建表单,以及在表单中包含哪些字段。
根据模型 Topic 创建一个表单,该表单只包含字段 text
'''
class TopicForm(forms.ModelForm):
    class Meta:
        model = Topic
        fields = ['text']
        # 让 Django 不要为字段 text 生成标签。
        labels = {'text': ''}

2 learning_logs/urls.py

# -*- coding: utf-8 -*-

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^topics/$', views.topics, name='topics'),
    url(r'^topics/(?P\d+)/$', views.topic, name='topic'),
    
    # 用于添加新主题的网页
    # 该URL 模式将请求交给视图函数 new_topic()
    url(r'^new_topic/$', views.new_topic, name='new_topic'),
]

3 learning_logs/views.py

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponseRedirect, Http404
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required

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

def index(request):
    return render(request, 'learning_logs/index.html')

def topics(request):
    topics = Topic.objects.filter(owner=request.user).order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

def topic(request, topic_id):
    topic = Topic.objects.get(id=topic_id)
    # Make sure the topic belongs to the current user.
    if topic.owner != request.user:
        raise Http404
        
    entries = topic.entry_set.order_by('-date_added')
    context = {'topic': topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

def new_topic(request):
    """ 添加新主题 """
    if request.method != 'POST':
        # 未提交数据:创建一个新表单
        form = TopicForm()
    else:
        # POST 提交的数据 , 对数据进行处理
        # HttpResponseRedirect 类,用户提交主题后我们将使用这个类将用户重定向到网页 topics 。
        # 函数 reverse() 根据指定的 URL 模型确定 URL ,这意味着 Django将在页面被请求时生成 URL 。
        # 我们还导入了刚才创建的表单 TopicForm 。
        # 我们使用用户输入的数据(它们存储在 request.POST 中)创建一个 TopicForm 实例
        # 这样对象 form 将包含用户提交的信息。
        form = TopicForm(request.POST)
        # 函数 is_valid() 核实用户填写了所有必不可少的字段(表单字段默认都是必不可少的),
        # 且输入的数据与要求的字段类型一致(例如,字段 text 少于 200 个字符)。
        # 这种自动验证避免了我们去做大量的工作。
        if form.is_valid():
            new_topic = form.save(commit=False)
            new_topic.owner = request.user
            # 将表单中的数据写入数据库
            new_topic.save()
            # 使用 reverse() 获取页面 topics 的 URL ,并将其传递给 HttpResponseRedirect()
            # 后者将用户的浏览器重定向到页面 topics 。
            # 在页面 topics 中,用户将在主题列表中看到他刚输入的主题。
            return HttpResponseRedirect(reverse('learning_logs:topics'))

    context = {'form': form}
    return render(request, 'learning_logs/new_topic.html', context)

4 learning_logs/templates/learning_logs/new_topic.html

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

{% block content %}
  

添加新主题

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

5 learning_logs/templates/learning_logs/topics.html

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

{% block content %}

  

学习笔记

    {% for topic in topics %}
  • { { topic }}
  • {% empty %}
  • No topics have been added yet.
  • {% endfor %}
添加主题 {% endblock content %}

二 运行测试

Django项目——使用表单添加数据_第1张图片

Django项目——使用表单添加数据_第2张图片

Django项目——使用表单添加数据_第3张图片

Django项目——使用表单添加数据_第4张图片

你可能感兴趣的:(Django,Django)