前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >django2.0入门教程第四节

django2.0入门教程第四节

作者头像
章鱼喵
发布于 2018-06-27 07:23:41
发布于 2018-06-27 07:23:41
81100
代码可运行
举报
文章被收录于专栏:codingcoding
运行总次数:0
代码可运行

继上篇 django2.0入门教程第三节,介绍了django2.0的视图views和模板template, 本节介绍如何在前台进行投票。

构建一个简单的表单提交页

polls/templates/polls/detail.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{%url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
    <input id="choice{{ forloop.counter }}" type="radio" name="choice" value="{{ choice.id }}">
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
    {% endfor %}
    <br />
    <input type="submit" name="" id="" value="投票" />
</form>

代码解析:

  • form表单提交的url为{%url 'polls:vote' question.id %}, 即表示访问polls/views.py的vote方法,并携带问题id作为参数。
  • 将问题的相关选项遍历,以单选框显示
  • form表单用post方式提交数据

配置url

polls/urls.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
path('<int:question_id>/vote/', views.vote, name='vote'),

投票页面截图 http://127.0.0.1:8000/polls/1/

vote.png

视图层处理提交结果

polls/views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from .models import Question, Choice
# ...
def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "必须选择一个选项",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

代码解析:

  • request.POST['choice']接收表单页面提交的数据
  • 将投票次数加1,并更新数据库

显示投票结果

polls/views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render, get_object_or_404
# ...
def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})

results.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{choice.votes}}</li>
{% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">再投一次?</a>

提交结果页面 http://127.0.0.1:8000/polls/1/results/

result.png

优化url和view写法

另一种写法:

将主键id代替question_id

polls/urls.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#_*_coding:utf8_*_
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),
]

使用<pk>代替<question_id>会更加灵活,<pd>代表主键

相应的视图也需要修改成另一种写法,vote方法保持原样,用于比较两种写法的不同

polls/views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#_*_coding:utf8_*_
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.views import generic 
from .models import Question, Choice

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        return Question.objects.order_by('-pub_date')[:5]

class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

def vote(request, question_id):
    # ...

入门教程不会对代码进入深入的讲解,先大致了解其作用即可,后续再逐个模块进行解析

源码下载

相关源码包

如果对django2.0教程感兴趣,请关注我的简书,持续更新中...

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.01.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
centos7中python3环境支持s
在centos7环境中常规安装python3的话无法支持sqlite3和ssl,所以在安装pytho3是需要带上sqlite3库和ssl库:
py3study
2020/01/03
3770
解决Django:SQLite 3.8.3 or later is required
在我的CentOS系统上安装了django==2.2.8并创建了一个webApps项目,使用:
kirin
2020/06/08
3.6K1
django 2.2 django.core.exceptions.improperlyconfigured sqlite 3.8.3 or later is required (found 3.7.
django.core.exceptions.improperlyconfigured sqlite 3.8.3 or later is required (found 3.7.17)
卓越笔记
2023/02/18
2590
Linux启动Django项目提示'SQLite 3.8.3 or later is required'
1、Python版本:Python 3.6.8 2、Django版本:3,.1.3 3、报错信息
沈宥
2022/12/05
9190
Linux启动Django项目提示'SQLite 3.8.3 or later is required'
ImproperlyConfigured('SQLite 3.8.3 or later is required Centos升级SQLite
wget https://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz
大数据流动
2021/04/23
8820
构建django的docker镜像
采用centos镜像作为地板镜像,然后安装python3、pip3,再安装django即可。
Devops海洋的渔夫
2019/05/31
1.7K0
Docker 基于Dockerfile创建镜像实践
简单说,就是创建一个服务型的镜像,即运行基于该镜像创建的容器时,基于该容器自动开启一个服务。具体来说,是创建一个部署了nginx,uwsgi,python,django项目代码的镜像,运行基于该镜像创建的容器时,自动开启nginx,uwsgi等服务。简单理解就是在容器内部,通过nginx+uwsgi部署Django项目
授客
2021/08/18
8800
Django使用manager.py 运行项目,或者uWSGI进行部署项目,使用Nginx进行负载均衡
安装好之后, 然后到python的解压文件夹下 Modules 目录, 找到Setup.dist文件,将下面几行的注释去掉(下图已去掉)。 vim Setup.dist (约50%处) 209行,原来人家是注释的,你打开,之后就变为
一写代码就开心
2022/05/18
1K0
Django使用manager.py 运行项目,或者uWSGI进行部署项目,使用Nginx进行负载均衡
基于 Django 的个人网站(6)
上回说到,我们给前端界面添加了样式,这回我就不配置其他数据库了,就用默认的 SQLite,直接进行部署,在部署之前,我们现在服务器上安装相应的运行环境,我在这里使用 Gunicorn+Nginx,进行部署,我们先来简单配置运行环境。
不可言诉的深渊
2020/05/29
1.4K0
CentOS 7 用户必看SQLite 升级指南:轻松将旧版 3.7.17 升级至3.41.2详细教程
去验证一下:在 centos 上进入 python,可以看到 sqlite3 的版本为 3.7.17。
汀丶人工智能
2023/12/26
1.6K0
CentOS 7 用户必看SQLite 升级指南:轻松将旧版 3.7.17 升级至3.41.2详细教程
SQLite 基础18
原文地址http://soft.dog/2016/03/15/sqlite-basic/
franket
2021/12/01
2180
面试题二十一期-linux搭建python+django框架,这个必须中~
就算所有人都不支持你。这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾。
测试小兵
2019/11/21
5510
Django 2.1.7 runserver启动直接报错 django.core.exceptions.ImproperlyConfigured: Passing a 3-tuple to i...
在其他办公电脑创建的Django项目 2.2.1 版本都可以直接 runserver 启动服务正常。 但是本地创建的项目,只要执行python3 manage.py runserver 就直接报错。
Devops海洋的渔夫
2019/06/11
2.7K0
Django 2.1.7  runserver启动直接报错 django.core.exceptions.ImproperlyConfigured: Passing a 3-tuple to i...
django 报错 Error loading either pysqlite2 or sqlite3 modules
http://stackoverflow.com/questions/1210664/no-module-named-sqlite3
魔王卷子
2019/06/02
2.1K0
Django 2 生产环境部署 uwsgi nginx
Django在开发过程中可以使用python3 manage.py runserver启动web服务,但是这个服务只是用来开发调试使用的。 正常的部署情况需要使用 uwsgi + nginx 进行服务部署。
Devops海洋的渔夫
2019/10/15
8100
Django 2 生产环境部署 uwsgi  nginx
django入门:环境及项目搭建
博客:https://www.jianshu.com/u/9fcd71535294
陈宇明
2020/12/15
6430
django入门:环境及项目搭建
docker 运行python web服
创建一个最最简单的python+django项目,然后在docker容器中运行。 环境: 192.168.174.134服务器中 docker镜像: python:2(python2.7.15) django: 1.8.3 1. 在134服务器中创建python项目 django-admin startproject ops python manage.py migrate 创建一个root用户 python manage.py createsuperuser
py3study
2020/01/08
8260
Centos7 安装python虚拟环境+Django
鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper。 virtualenvwrapper提供了一系列命令使得和虚拟环境工作变得便利。它把你所有的虚拟环境都放在一个地方。
py3study
2018/08/03
1.6K0
将Django部署到Centos7全攻略
Django部署到Cenos7需要安装大量的依赖包, 有很多坑需要踩, 这里是踩坑后探索出的标准化步骤
zhaoolee
2018/09/30
1.6K0
将Django部署到Centos7全攻略
SQLite 安装
SQLite 的一个重要的特性是零配置的,这意味着不需要复杂的安装或管理。本章将讲解 Windows、Linux 和 Mac OS X 上的安装设置。
子润先生
2021/07/02
1.2K0
推荐阅读
相关推荐
centos7中python3环境支持s
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验