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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/84726892

一 代码 

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<topic_id>\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 %}
  <p>添加新主题</p>

  <!--实参 action 告诉服务器将提交的表单数据发送到哪里,这里我们将它发回给视图函数 new_topic() 。
      实参 method 让浏览器以 POST 请求的方式提交数据。-->
  <form action="{% url 'learning_logs:new_topic' %}" method='post'>
    <!--来防止攻击者利用表单来获得对服务器未经授权的访问(这种攻击被称为 跨站请求伪造 )。-->
    {% csrf_token %}
    <!--显示表单,从中可知 Django 使得完成显示表单等任务有多简单:
        我们只需包含模板变量 form.as_p ,就可让 Django 自动创建显示表单所需的全部字段。
        修饰符 as_p 让 Django 以段落格式渲染所有表单元素,这是一种整洁地显示表单的简单方式。-->
    {{ form.as_p }}
    <button name="submit">添加主题</button>
  </form>
    
{% endblock content %}

5 learning_logs/templates/learning_logs/topics.html

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

{% block content %}

  <p>学习笔记</p>

  <ul>
    {% for topic in topics %}
      <li>
        <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
      </li>
    {% empty %}
      <li>No topics have been added yet.</li>
    {% endfor %}
  </ul>
  
  <a href="{% url 'learning_logs:new_topic' %}">添加主题</a>

{% endblock content %}

二 运行测试

扫描二维码关注公众号,回复: 4338567 查看本文章

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/84726892