资讯专栏INFORMATION COLUMN

Django实际应用-投票程序(三)

IT那活儿 / 1940人阅读
Django实际应用-投票程序(三)

点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!


01


model模型


1.1 ORM架构介绍

  • object :对象﹐对应django模型中的class
  • Relationship:关系﹐对应关系型数据库
  • Mapping:映射
  • 一个class对应数据库中的一张表
  • 表中的字段与class中的类变量对应
  • 数据库中的数据类型也与django模型中的类映射
  • 表中的每个记录都与class的实例对应

1.2 编写models.py

from django.db import models

# Create your models here.

class Question(models.Model):

question_text = models.CharField(max_length=200, unique=True)

pub_date = models.DateTimeField() #不加Field,没有时分秒

class Chioce(models.Model):

chioce_text = models.CharField(max_length=200, unique=True)

votes = models.IntegerField(default=0)

question = models.ForeignKey(Question) #如果想要修改字段名,在配置文件中修改之后,重新生成表

1.3 生成表

python manage.py makemigrations

python manage.py migrate

1.4 将模型加入到后台页面

# polls/admin.py

from  django.contrib import  admin# 在当前目录下的models模块中导入模型

from .models import   Question, Choice

# Register your models here.

admin.site.register(Question)

admin.site.register(Choice)

1.5 问题解决办法

class Question(models.Model):

question_text = models.CharField(max_length=200, unique=True)

pub_date = models.DateTimeField()

def __str__(self):

return question:%s % self.question_text

class Chioce(models.Model):

chioce_text = models.CharField(max_length=200, unique=True)

votes = models.IntegerField(default=0)

question = models.ForeignKey(Question)

def __str__(self):

return %s:%s % return %s:%s % (self.question,self.chioce_text)

02


Django API(首页)



2.1 在views文件中把问题取出来传给html

# polls/views.py

from django.shortcuts import render

from .models import Question

def index(request):

  questions = Question.objects.order_by(-pub_date)

returnrender(request, index.html, {questions: questions})

2.2 编辑index.html



<htmllang="en">

<head>

<metacharset="UTF-8">

<title>投票首页title>

head>

<body>

<div class="container">

<div class="content">

<h1>投票首页h1>

<ol>

{% for question in questions %}

<li>

<a href="{% url a question.id %}" target="_blank">
#question_id是views.py中的d+这个参数,数据库中没有指定主键时Django会自动创建主键,question_id就是问题的id号

{{ question.question_text }}a>

     {{ question.pub_date }}

li>

{%endfor%}

ol>

div>

div>

body>

html>

2.3 可以添加轮播图

<div class="container">

<div id="linux-carousel" class="carousel slide">

<ol class="carousel-indicators">

<li class="active" data-target="#linux-carousel" data-slide-to="0">li>  #轮播图下面的小圆点

<li data-target="#linux-carousel" data-slide-to="1">li>

<li data-target="#linux-carousel" data-slide-to="2">li>

ol>

<div class="carousel-inner">

<div class="item active">

<a href="http://www.sogou.com" target="_blank">

<img src="{% static imgs/first.jpg %}">

a>

div>

<div class="item">

<img src="{% static imgs/second.jpg %}">

div>

<div class="item">

<img src="{% static imgs/third.jpg %}">

div>

div>

<a href="#linux-carousel" data-slide="prev" class="carousel-control left"> <span class="glyphicon glyphicon-chevron-left">span>    #向左翻



制作投票详情页

a>

<a href="#linux-carousel" data-slide="next" class="carousel-control right"> <span class="glyphicon glyphicon-chevron-right">span>   #向右翻

a>

div>

<script src="{% static js/jquery.min.js %}">script>    #要有JS代码才能实现轮播图

<script src="{% static js/bootstrap.min.js %}">script>

<script type="text/javascript">

2.4 模板继承(为了避免一些网页的重复代码)

1)复制index.html一本命令为bak.html

# 在basic.html中,将个性(不相同)内容用block替代

{% load static %}



<html lang="en">

<head><meta charset="UTF-8">

<title>{% block title %}{% endblock %}title>

<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" href="{% static css/bootstrap.min.css %}">

head>

<body>

<div class="container">

<div id="linux-carousel" class="carousel slide">

<ol class="carousel-indicators">

<li class="active" data-target="#linux-carousel" data-slide-to="0">li>

<li data-target="#linux-carousel" data-slide-to="1">li>

<li data-target="#linux-carousel" data-slide-to="2">li>

ol>

<div class="carousel-inner">

<div class="item active">

<a href="http://www.sogou.com" target="_blank">

<img src="{% static imgs/first.jpg %}">   #图片放在polls下static目录的imgs目录中

a>

div>

<div class="item">

<img src="{% static imgs/second.jpg %}">

div>

<div class="item">

<img src="{% static imgs/third.jpg %}">

div>

div>

<a href="#linux-carousel" data-slide="prev" class="carousel-control left"> <span class="glyphicon glyphicon-chevron-left">span>



制作投票详情页 a>

<a href="#linux-carousel" data-slide="next" class="carousel-control right"> <span class="glyphicon glyphicon-chevron-right">span>

a>

div>

{% block content %}{% endblock %}

<script src="{% static js/jquery.min.js %}">script>

<script src="{% static js/bootstrap.min.js %}">script>

<script type="text/javascript">script>

body>

html>

2)index.html

# 修改index.html,把共性内容删除,个性内容写到对应的block中

{% extends bak.html %} #继承

{% load static %}

{% block title %}投票首页{% endblock %}

{% block content %}

class="content h4">

class="text-center text-warning">投票首页



    "margin: 20px 0">

    {% for question in questions %}

  1. "{% url detail question.id %}" target="_blank">

    {{ question.question_text }}
    {{ question.pub_date }}

  2. {% endfor %}





{% endblock %}

03


制作a.html(次页)


3.1 编辑views.py

from django.shortcuts import render

from .models import Question, Chioce

# Create your views here.

def index(request):

d = Question.objects.order_by(-pub_date)

return render(request,index.html,{d:d})

def a(request,question_id):

c = Question.objects.get(id=question_id)

return  render(request,a.html,{id:c})

def result(request,id):

return  render(request,result.html,{id:id})

3.2 编辑a.html(取出选项)

{% extends bak.html%}

{% load static %}

{% block title%}polls{%endblock%}

{% block content%}

<div class="container">

<h1>{{ id.id }}h1>

div>

<div class="content h4 text-warning"  >

<h1 class="text-center">chioceh1>

<h2>{{ id }}h2>

<form action="">
      {% csrf_token %} #安全选项

{% for i in id.chioce_set.all %}

<div class="radio">

<label >

<input type="radio" name="chioce_id" value="{{ chioce_id }}">

{{ i.chioce_text }}

label>

div>

{% endfor %}

form>

div>

<div class="group">

<input  class="btn btn-primary" tpye="submit" value="submit">

div>

{%endblock%}

04


实现投票功能


实现数据库的增删改查。执行函数对model模型的操作(url-->views-->model)

4.1 配置urls.py

from django.conf.urls import url,include

from django.contrib import admin

from . import  views



urlpatterns = [

url(r^$, views.index,name=index),

url(r(d+)/$, views.a,name=a),

url(r(d+)/result/$, views.result,name=result),

url(r(d+)/vote/$, views.vote,name=vote),

]

4.2 配置views.py

from django.shortcuts import  render, redirect

from .models import Question, Chioce

# Create your views here.

def index(request):

d = Question.objects.order_by(-pub_date)

return render(request,index.html,{d:d})

def a(request,question_id):

c = Question.objects.get(id=question_id)

return  render(request,a.html,{id:c})

def result(request,id):

return  render(request,result.html,{id:id})

def vote(request,id):

d = Question.objects.get(id=id) #取出问题

# 当用户提交表单时,request.POST是一个字典,里面记录了与POST相关的数据

# choice_id是detail.html页面中单选按钮的name,值是选项的id(value的值)

chioce_id = request.POST.get(chioce_id) #取出name的值

chioce = d.chioce_set.get(id=chioce_id) #取出对用id的项

chioce.votes += 1

chioce.save()

# 这里返回使用的不是render,因为render直接返回页面,URL不变,也就是http://x.x.x.x/polls/2/vote显示的是2号问题的投票结果,这是不合理的应该由http://x.x.x.x/polls/2/result/显示投票结果。所以使用redirect

return redirect(result,id)

4.3 配置a.html

{% extends bak.html%}

{% load static %}

{% block title%}polls{%endblock%}

{% block content%}

<div class="container">

<h1>{{ id.id }}h1>

div>

<div class="content h4 text-warning"  >

<h1 class="text-center">chioceh1>

<h2>{{ id }}h2>

<form action="{% url vote id.id %}" method="post">

{% csrf_token %}

{% for i in id.chioce_set.all %}

<div class="radio">

<label >

<input type="radio" name="chioce_id" value="{{ i.id }}">

{{ i.chioce_text }}

label>

div>

{% endfor %}

<div class="form-group">

<input  class="btn btn-primary" type="submit" value="submit">

div>

form>

div>



{%endblock%}


05


配置result.html


5.1 views.py

from django.shortcuts import  render, redirect

from .models import Question, Chioce

# Create your views here.

def index(request):

d = Question.objects.order_by(-pub_date)

return render(request,index.html,{d:d})

def a(request,question_id):

c = Question.objects.get(id=question_id)

return  render(request,a.html,{id:c})

def result(request,id):

d = Question.objects.get(id=id)

return  render(request,result.html,{id:d})

def vote(request,id):

d = Question.objects.get(id=id)

chioce_id = request.POST.get(chioce_id)

chioce = d.chioce_set.get(id=chioce_id)

chioce.votes += 1

chioce.save()

return redirect(result,id)

5.2 配置resul.html

{% extends bak.html%}

{% load static %}

{% block title%}投票结果{%endblock%}

{% block content%}

<div>

<h1 class="text-center">{{ id.id }}投票结果h1>

<table class="table table-striped table-hover">

<thead class="bg-primary">

<tr>

<td colspan="2">{{ id.question_text }}td>

tr>

thead>

{% for i in id.chioce_set.all %}

<tr>

<td>{{ i.chioce_text }}td>

<td >{{ i.votes }}td>

tr>

{%endfor%}

table>



div>

{%endblock%}

end




本文作者:周世豪

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129646.html

相关文章

  • Django 2.0 - 创建第一个Django应用 - 第一部分

    摘要:创建投票应用采用创建的工程包括两个层级,一个是叫工程,另外一个是工程下面的应用。一个工程可以包含多个应用。路由配置分成两个层级,一个是在应用层配置路由,另外一个是在工程层配置路由。 一般Django的网络程序开发步骤 配置开发的环境 初始化项目 启动开发服务器 创建应用 创建View 配置访问View的路由 配置项目开发环境 开发一个新的项目,第一步就是配置项目的开发环境。这里使用...

    TalkingData 评论0 收藏0
  • 两篇文章帮你入门Django(上)

    摘要:本文结合官方文档中的个小教程,帮你了解。一共分上下两篇文章,上篇主要来分析处理的机制,下篇来介绍下提供的后台管理,以及单元测试等强大的功能。项目创建成功之后,可以运行生成相应的数据库表是引入的命令,较早的版本可以用其他的命令代替。 原文地址 相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站、网络应用程序以及网络服务的开发。那么为什么我们需要...

    shuibo 评论0 收藏0
  • Kubernetes和OpenStack的多云端网络

    摘要:上周,在举行的上,发布,整合和。多亏存储应用程序会话到数据库通常来说是下载安装或者是,我们不需要特定的负载均衡器,运行完全没有问题。用负载均衡器描述的展示了浮动和私有集群。特别感谢来自的的支持和在测试过程中作出的贡献。 上周,在Austin举行的OpenStack Summit上,CoreOS发布Stackanetes,整合Kubernetes和OpenStack。 一个月前,Core...

    Hwg 评论0 收藏0
  • Python测试开发中Django和Flask框架的区别

    摘要:在谈中框架和框架的区别之前,我们需要先探讨如下几个问题。通过大数据统计分析全球著名的网站对和这两个框架的调查分析。从全球著名的代码托管平台上的和数量上分别为,分别为。 在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题。 一、为什么要使用框架? showImg(https://segmentfault.com/img/remote/14600000...

    B0B0 评论0 收藏0
  • Zookeeper学习系列【】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)

    摘要:协议是为分布式协调服务专门设计的一种支持崩溃恢复的一致性协议,这个机制保证了各个之间的同步。选主是协议中最为重要和复杂的过程。以实际效果而言,分区相当于对通信的时限要求。参考官方文档阿里巴巴为什么不用做服务发现定理的含义阮一峰 前言 同学们,在上一章中,我们主要讲了Zookeeper两种启动模式以及具体如何搭建。本章内容主要讲的是集群相关的原理内容,第一章可以当做是Zookeeper原...

    Olivia 评论0 收藏0
  • Django前端页面测试

    Django前端页面测试 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; margin...

    IT那活儿 评论0 收藏1018

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<