【Web开发二】Django框架中部署一套投票网站

news/2024/5/21 1:02:52/文章来源:https://blog.csdn.net/qq_27592485/article/details/102958808

Django原理,URLS路由接收到客户端访问的请求------>view视图函数进行请求的处理-------->models模型(数据库)进行数据的处理--------->view视图函数进行数据的处理--------->template模板(HTML)进行数据的展示,反馈给客户端

一、初始化数据库,生成管理后台的用户。登录管理后台

python manage.py migrate       #初始化数据库

python manage.py createsuperuser      #创建超级用户

二、创建模型,模型,也就是关联到数据库的类函数,例如投票系统,那么就有投票项,投票项创建时间,投票内容选项,投票内容选项创建时间,票数。遵从数据库的准则,我们把投票项,和投票内容选项分开在两个表。

打开models.py

from django.db import models

# Create your models here.
class Question(models.Model):                                        #创建这样类,继承于父类
    question_text = models.CharField(max_length=200)   #创建实例,类型为字符,最大长度200
    publish_date = models.DateTimeField('publish date')  #创建实例,类型为时间,声明为xxxx
    
    def __str__(self):                                                           使用str方法,返回问题内容
        return self.question_text

class Choice(models.Model):                                            #创建这样类,继承于父类
    choice_text = models.CharField(max_length=100)       #创建实例,类型为字符,最大长度100
    publish_date = models.DateTimeField('publish date')   #创建实例,类型为时间,声明为xxxx
    vote = models.IntegerField(default=0)                           #创建实例,类型为数字,默认为0
    question = models.ForeignKey(Question, on_delete=models.CASCADE) #创建实例,类型为(Question)外键,删除关联
    
    def __str__(self):                                                             使用str方法,返回问题选项内容
        return self.choice_text

三、把应用添加到项目里面,把模型注册到后台管理。并且优化管理后台。

1、打开settings.py

2、打开admin.py

from django.contrib import admin
from .models import Question, Choice                                     #导入模块
class QuestionAdmin(admin.ModelAdmin):                              #新建模型,集成于父类
    list_display = ('question_text', 'publish_date')                       #优化后台管理器显示
    list_filter = ('publish_date',)                                                    #使用时间作为过滤器
    search_fields = ('question_text',)                                           #使用内容作为搜索器
    ordering = ('-publish_date', 'question_text')                           #使用降序时间排序,使用问题排序
    date_hierarchy = 'publish_date'                                             #使用时间作为时间轴

class ChoiceAdmin(admin.ModelAdmin):
    list_display = ('question', 'choice_text', 'vote', 'publish_date')
    list_filter = ('publish_date',)
    search_fields = ('choice_text',)
    ordering = ('-publish_date', 'vote')
    date_hierarchy = 'publish_date'
    raw_id_fields = ('question',)                                                     #优化选项,效果是显示question详情

admin.site.register(Question, QuestionAdmin)                            #注册到管理后台
admin.site.register(Choice, ChoiceAdmin)

3、效果如图

4、我们都说了,模型就是关联到数据库的。现在模型有了。那么就应该把模型。应用到数据库上,让数据库生成模型里面的字段。

python manage.py makemigrations         #生成数据库语句

python manage.py migrate                       #执行语句

三、在web页面创建问题和相关选项。

生成问题

生成对应问题的选项

四、查看数据库,可以得到,polls_question和polls_choice这2个表格,有了刚刚我们输入的内容了。并且,Django自动为他们加入了id主键。并且choice表格里面有外键约束。

五、制作主页,走一遍Django的工作原理

根据Django的工作原理,我们第一步要修改的,应该是应用的urls文件

1、打开urls.py

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

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

这里已经写好去index的路由了。交友view里面的index函数处理。

2、打开views.py

from django.shortcuts import render, HttpResponse
from .models import Question, Choice                                          #导入模块

# Create your views here.
def index(request):                                                                         #创建index函数
    question = Question.objects.all()                                                #定义实例question,值为Question的对象查询集合
    return render(request, 'polls/index.html', {'question': question}) #发送数据到polls下的index.html,参数名为question,值为question

3、创建模板目录,创建模板文件

mkdir -p  polls/templates/polls

4、编写index.html文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>polls主页</title>
</head>
<body>
<ul>
    {% for q in question %}
    <li>
        <a href="此处填写的是超链接跳转的页面,暂时留空">
            {{ q.question_text }}
        </a>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ q.publish_date }}
    </li>
    {% endfor%}
</ul>
</body>
</html>

效果如图

六、制作每个问题的详情页,实现访问主页,并且会进行跳转。

1、惯例修改urls文件。

打开urls.py

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

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'(?P<question_id>\d+)/$', views.detail, name='detail') ###规划url,我们用数字来做一个变量。然后根据数字来匹配polls_question的id,实现准确的定位到question_text。
]

2、修改views.py文件。新增detail视图函数,获取数据,然后发送给模板文件。

def detail(request, question_id):                                                        #question_id是从url这里获取的
    question = Question.objects.get(id=question_id)                          #通过get的方法,获得对应的question实例
    return render(request, 'polls/detail.html', {'question': question})

3、创建detail.html文件,然后根据实际需求,编写对应的视图界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>投票详情页</title>
</head>
<body>
<p>{{ question }}</p>
<form action="此处留空,作用是提交数据到vote的">
    {% for c in question.choice_set.all %}
        <input type="radio" name="c_id" value="{{c.id}}">{{ c.choice_text }}       ##name和value处,后面会说明
    {% endfor %}
    <input type="submit" value="提交">
</form>
</body>
</html>

4、修改主页index.html,为超链接匹配detail.tml的模板

打开index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>polls主页</title>
</head>
<body>
<ul>
    {% for q in question %}
    <li>
        <a href="{% url 'detail' question_id=q.id %}">    #调用url模块,匹配detail视图函数,作为参数的question。值为q.id
            {{ q.question_text }}
        </a>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ q.publish_date }}
    </li>
    {% endfor%}
</ul>
</body>
</html>

到此,我们实现了。超链接跳转的问题了。

七、制作投票结果的工作

1、urls.py文件新增记录

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

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'(?P<question_id>\d+)/$', views.detail, name='detail'),
    url(r'(?P<question_id>\d+)/result/$', views.result, name='result'),   #新增
]

2、新增views.py文件中的函数

def result(request, question_id):
    question = Question.objects.get(id=question_id)
    return render(request, 'polls/result.html', {'question': question})

3、新增模板中的result.html文件,根据实际需求规划好数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>投票结果页</title>
</head>
<body>
<table border="1px">
    <tr>
        <td colspan="2">{{ question }}</td>
    </tr>
    {% for c in question.choice_set.all %}
    <tr>
        <td>
            {{ c.choice_text }}
        </td>
        <td>
            票数:{{ c.vote }}
        </td>
    </tr>
    {% endfor %}
</table>
</body>
</html>

效果如图

八、创建投票的程序,思路应该是这样的,在主页中,选择哪个问题,就相当于用question_id,打开对应的详情页,然后在详情页里面,选择哪个选项,选项的id会从表单中post到vote的程序。vote程序对数据进行+1,进行投票。然后投票结束后反馈结果页面给客户端。我们先做detail主页的代码,然后再完善投票程序。

1、

1、新增urls.py文件的代码

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

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'(?P<question_id>\d+)/$', views.detail, name='detail'),
    url(r'(?P<question_id>\d+)/result/$', views.result, name='result'),
    url(r'(?P<question_id>\d+)/vote/$', views.vote, name='vote'),
]

2、新增views.py文件记录。

def vote(request, question_id):                                   #创建vote程序,参数question_id是从detail中获取
    choice_id = request.POST.get('c_id')                      #利用request的方法,获取参数c_id
    c = Choice.objects.get(id=choice_id)                      #获取到Choice的实例
    c.vote += 1                                                               #票数+1
    c.save()
    return redirect('result', question_id=question_id)     #重定向到result页面。

3、修改detail.py文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>投票详情页</title>
</head>
<body>
<p>{{ question }}</p>
<form action="{% url 'vote' question_id=question.id %}" method="post">    #方式为post,然后提交数据到vote,参数为XXXXX
    {% for c in question.choice_set.all %}
        <input type="radio" name="c_id" value="{{ c.id }}">{{ c.choice_text }}
    {% endfor %}
    <input type="submit" value="提交">
</form>
</body>
</html>

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

基本完成

效果如下

css样式,bootstrap样式,返回首页等等都可以添加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_869043.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站技术架构:核心原理与案例分析----Memcached分布式缓存集群的访问模型剖析

前提&#xff1a; 本文是基于memcached1.4版本的&#xff0c;之前的版本与该版本在一些地方是不一样的&#xff08;eg.《memcached全面剖析》的memcached1.2的内存管理方式就与1.4不同&#xff09;在看本文之前&#xff0c;最好先看一下memcached在实际开发中怎么进行操作的&a…

【转】nbsp;实现网站的中英文转换

1.新建一个asp.net web应用程序 2.创建的项目如下图所示 3.右击web项目名称,添加一个全局资源文件夹"app_GlobalResources" ,这个是asp.net 2.0特有的 4.右击"app_GlobalResources"文件夹,添加两个资源文件: language.resx(简体资源文件) 和language.en-u…

【转】ASP.NET网站实现中英文转换…

摘要&#xff1a;随着计算机网络的发展&#xff0c;一些商业机构也开始向国际市场迈进。因此这些商业的机构的网站 也开始面向全世界的用户&#xff0c;要求网站具有多语言的选择&#xff0c;实现本地化。在.NET1.1框架下面&#xff0c;如果你要实现本地化&#xff0c;你可能要…

这个网站他不简单系列(一)低调而强大的DICT.CN

这个网站他不简单系列(一)低调而强大的DICT.CN emilmatthew 08/06/25 OK&#xff0c;闲话少说&#xff0c;我们先看网站&#xff1a;DICT.CN&#xff0c;不知诸位看下来有何感觉&#xff1f;是啊&#xff0c;不就是个在线词典吗&#xff1f;是啊&#xff0c;我也觉得不就是个在…

[8.18]东西放久了会发霉的,网站也一样,拿出来晒晒~~~

这个网站叫DOUPACK(中文名称叫豆瓣包裹),主要的意图就是可以在屏幕上拖动你的豆瓣小组,组成一个你喜欢的样子.感觉最后会变成一个恶搞度>实用度的应用.由于整个用户系统都要弄下来,所以制作时间有些长... 去年11月开始做的,原先是利用业余时间做的,弄了4个月,还差一个月的工…

web2.0网站的四大特性简述

本文文字内容转自天极网: http://homepage.yesky.com/216/2634716.shtml 本文图片转自: http://web2.wsj2.com/architectures_of_participation_the_next_big_thing.htm 收集和学习了大家对于Web2.0特性的看法&#xff0c;加上这几天的思考&#xff0c;整理我对于Web2.0到底是…

Gin + GoCv + Element 简单搭建图片风格迁移网站

成品效果 输入&#xff1a;jpg/png 格式图片 输出&#xff1a;风格迁移后的图片 目录结构 # tree├─controller // 控制器 ├─models // 风格迁移模型 │ ├─eccv16 │ └─instance_norm ├─router // 路由转发 ├─static // 静态资源 ├─sys // 系统配置 ├─tem…

手机访问网站 点击手机号码直接拨打电话

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 手机访问网站,点击手机号码直接拨打电话: …

使用IntelliJ IDEA开发SpringMVC网站

转自https://my.oschina.net/gaussik/blog/385697 1.安装jdk&#xff0c;maven和tomcat 2.创建maven web项目 Create New Project 最后生成结果如下图&#xff0c;注意左侧部分 上侧部分选择Auto-Import就好 如果生成过慢&#xff0c;可以参看下面两篇文章&#xff1a; 文章1&a…

回首10年前的30个最受欢迎的网站

10年前的Web技术还比较落后&#xff0c;浏览器功能也非常有限&#xff0c;你知道现在最受欢迎的这些网站&#xff0c;在10年前甚至更早的时候是什么样子吗&#xff1f;文中为你揭示包括Google、雅虎、eBay、维基百科等网站的老面孔&#xff1a; 1. Google (1998) Google (1998…

让你的Onedrive网盘秒变网站,文件展示,直连下载,视频在线播放

之前我们介绍了免费的5TB的Onedrive网盘&#xff0c;不但能做本地硬盘使用&#xff0c;还能扩展你的硬盘&#xff0c;今天我们就来介绍一下另一款Onedrive网盘的神器OneIndex,这是针对Onedrive网盘的一个开源程序。可以将Onedrive存储的文件展示&#xff0c;直连下载。视频还能…

LAMP网站架构方案分析

LAMP&#xff08;Linux-Apache-MySQL-PHP&#xff09;网站架构是目前国际流行的Web框架&#xff0c;该框架包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;Perl、PHP或者Python编程语言&#xff0c;所有组成产品均是开源软件&a…

如何更改VS2005调试网站的浏览器类型

选择网站根目录&#xff0c;右键单击 选择“浏览方式” 在这里就可以设置浏览器的类型了 转载于:https://www.cnblogs.com/qishichang/archive/2007/11/25/971588.html

微软官宣IE将“退役”,老网站如何 实现在Chrome、Firefox中兼容运行?

问题 美国微软公司为了推广其Chromium内核的Edge浏览器&#xff0c;在2021年5月19日突然宣布&#xff0c;自2022年6月15日起&#xff0c;绝大多数版本的Windows 10系统将不再支持IE浏览器&#xff0c;因此IE即将彻底退出互联网的舞台。具体来说微软决定将不再支持Windows 10所…

Python必去的6个网站

1.The Hitchhiker’s Guide to Python。 equests作者创建的网站&#xff0c;对于Python的方方面面都有指导作用 2. Python 3 Module of the Week 和 Python Module of the Week。 Python 3 Module of the Week系列文章&#xff0c;每篇介绍一个 Python 标准库的使用 3. …

你的网站被流量冲崩了吗?稳住!ab来帮你了

【来源】 ab 全称 Apache Benchmar , 顾名思义是Apache提供的一种性能测试工具。主要作用是检测web服务每秒可以处理多少个请求。它可以用于apache、IIs、tomcat、nginx等服务器的简单压力测试 【语法】 格式&#xff1a;ab [options] path 其中options参数常用有以下&#xf…

推荐大家研究一个网站tineye.com

http://www.tineye.com/&#xff0c;这个站点做得很有想法&#xff0c;详细体验我过几天发出&#xff0c;有兴趣的朋友可以先看看。 刚刚用这个站点上传了我硕士毕业的标准照&#xff0c;回顾了那段意气奋发的年代。

如何应对高并发 —— 动态网站静态化

零. 前言 为了应对高并发&#xff0c; 大多数网站在更新不频繁的页面都做了动态网页静态化处理。 典型的如&#xff1a; 淘宝的首页、 网易新闻的首页等。 当然这些网站加载速度这么快&#xff0c; 不仅仅是静态化&#xff0c; 还有 CDN、 缓存等各个方面的优化。 从阿里在 Inf…

HTML5移动端手机网站开发流程

最近一直在研究移动手机网站的开发&#xff0c;发现做手机网站没有想象中的那么难。为什么会这么说呢&#xff1f;我们试想下:我们连传统的PC网站都会做&#xff0c;难道连一个小小的手机网站难道都搞不定吗&#xff1f;其实手机网站就是一个微缩版的PC网站罢了&#xff01;至于…