6.djnago实现问卷调查系统
一、功能实现
1、登录界面
2、表单界面
3、后台界面
4、excel导出功能
5、过滤器
2、代码实现
直接贴代码吧
model.py
from django.db import models class FormInfo(models.Model): """表单信息""" # 1.门诊编号 od_number = models.CharField('门诊编号', max_length=48) # 2.姓名 name = models.CharField('姓名', max_length=24, default=None, blank=True) # 3.性别 sex = models.CharField('性别', max_length=12, default=None, blank=True, null=True,) # 4.出生年月 birthday = models.CharField('出生年月', max_length=128, default=None, blank=True, null=True,) # 5.学历 education = models.CharField('学历', max_length=24, default=None, blank=True, null=True,) # 6.手机号, phone = models.CharField('手机号', max_length=20, default=None, blank=True, null=True,) # 7.微信号 chatNumber = models.CharField('微信号', max_length=48, default=None, blank=True, null=True,) # 8.现居地址 address = models.CharField('现居地址', max_length=256, default=None, blank=True, null=True,) # 9.初次性行为年龄 age = models.IntegerField('初次性行为年龄', max_length=12, default=None, blank=True, null=True,) # 10.性行为对象 nature_object = models.CharField('性行为对象', max_length=12, default=None, blank=True, null=True,) # 11.性行为人数 nature_number = models.IntegerField('性行为人数', max_length=12, default=None, blank=True, null=True,) # 12.近六个月性伴侣人数 sixNatureNumber = models.IntegerField('近六个月性伴侣人数', max_length=12, default=None, blank=True, null=True,) # 13.是否有多人性行为 many_nature = models.CharField('是否有多人性行为', max_length=12, default=None, blank=True, null=True,) # 14.平均性生活时间 nature_time = models.CharField('平均性生活时间', max_length=24, default=None, blank=True, null=True,) # 15.男-男性方式 twoMan_nature = models.CharField('男-男性方式', max_length=24, default=None, blank=True, null=True,) # 16.男-女性方式 manWoman_nature = models.CharField('男-女性方式', max_length=24, default=None, blank=True, null=True,) # 17.女-女性方式 twoWoman_nature = models.CharField('女-女性方式', max_length=24, default=None, blank=True, null=True,) # 18.女-男性方式 womanWman_nature = models.CharField('女-男性方式', max_length=24, default=None, blank=True, null=True,) # 20.几人同时 sexnumber = models.CharField('几人同时', max_length=48, default=None, blank=True, null=True,) # 21.几男几女 mannumber = models.CharField('几男几女', max_length=48, default=None, blank=True, null=True,) class SubmitPassword(models.Model): """提交密码""" password = models.CharField(max_length=128)
url配置
from django.contrib import admin from django.urls import path, include from formtest import views urlpatterns = [ # 登录页 path('login/', views.login), # 登录验证进入主页 path('index/', views.index), # 提交 path('submit/', views.submit), ]
视图
from django.shortcuts import render, redirect from formtest import models # Create your views here. # 登录页 def login(request): return render(request, 'formtest/login.html') # 登录验证进入表单 def index(request): q = request.GET.get('check') if not q: return render(request, 'formtest/login.html') else: try: user = models.SubmitPassword.objects.get(password=q) return render(request, 'formtest/questionnaire.html') except: return render(request, 'formtest/login.html') # 提交到数据库 def submit(request): # 1.门诊编号 od_number = request.GET.get('odnumber') print("门诊编号"+od_number) # 2.姓名 name = request.GET.get('name') print("姓名" + name) # 3.性别 male为男性,female为女性 sex = request.GET.get('Sex') print('性别', sex) # 4.出生年月 birthYear = request.GET.get('birthYear') birthMonth = request.GET.get('birthMonth') birthDay = request.GET.get('birthDay') birth = birthYear + "_" + birthMonth + "_" + birthDay print("出生日期"+birth) # 5.学历 education = request.GET.get('education') print("学历", education) # # 6.手机号, phone = request.GET.get('phoneNumber') print("手机号", phone) # # 7.微信号 chatNumber = request.GET.get('chatNumber') print("微信号", chatNumber) # # 8.现居地址 # 省 address1 = request.GET.get('address1') # 市 address2 = request.GET.get('address2') # 区 address3 = request.GET.get('address3') print("居住地", address1, address2, address3) # 详细住址 address = request.GET.get('address') print("详细住址", address) # # 9.初次性行为年龄 age = request.GET.get('firstSexAge') print("初次性行为年龄", age) # # 10.性行为对象 sextrue = request.GET.get('sexObject') print("性行为对象", sextrue) # # 11.性行为人数 nature_number = request.GET.get('sexNum') print("性行为人数", nature_number) # # 12.近六个月性伴侣人数 sixNatureNumber = request.GET.get('sixSexNum') print("近六个月性伴侣人数", sixNatureNumber) # # 13.是否有多人性行为 有为true没有为false many_nature = request.GET.get('multiSex') print("多人性行为", many_nature) # # 14.平均性生活时间 nature_time = request.GET.get('sexTime') print("平均性生活时间", nature_time) # # 15.男-男性方式 twoMan_nature = request.GET.get('m2m') print("男男性方式", twoMan_nature) # # 16.男-女性方式 manWoman_nature = request.GET.get('m2f') print("男女性方式", manWoman_nature) # # 17.女-女性方式 twoWoman_nature = request.GET.get('f2f') print("女女性方式", twoWoman_nature) # # 18.女-男性方式 womanWman_nature = request.GET.get('f2m') # print("女女性方式", womanWman_nature) # 19.几人同时 mannumber = request.GET.get('sameTimeSex') print('几人同时', mannumber) # 20.男女比例 manwuman = request.GET.get('manwuman') print('男女比例', manwuman) # 向数据库添加 models.FormInfo.objects.create( od_number=od_number, name=name, sex=sex, birthday=birth, education=education, phone=phone, chatNumber=chatNumber, address=address, age=age, nature_object=sextrue, nature_number=nature_number, sixNatureNumber=sixNatureNumber, many_nature=many_nature, nature_time=nature_time, # 男男 twoMan_nature=twoMan_nature, # 男女 manWoman_nature=manWoman_nature, #女女 twoWoman_nature=twoWoman_nature, #女男 womanWman_nature=womanWman_nature, sexnumber=mannumber, mannumber=manwuman, ) return render(request, 'formtest/questionnaire.html') admin页的设置
from django.contrib import admin from django.http import HttpResponse from .models import * import xlwt # 行 line = 1 # 列 row = 0 # 后台导出为Excel # @admin.register(Blog) class WLIndexAdmin(admin.ModelAdmin): # 显示列表页字段 list_display = ['od_number', 'name', 'sex', 'birthday', 'education', 'phone', 'chatNumber', 'address', 'age', 'nature_object', 'nature_number', 'sixNatureNumber', 'many_nature', 'nature_time', 'twoMan_nature', 'manWoman_nature', 'twoWoman_nature', 'womanWman_nature', 'sexnumber', 'mannumber'] # 过滤器 list_filter = ['sex', 'education', 'age', 'nature_object', 'nature_number', 'sixNatureNumber', 'many_nature', 'nature_time', 'twoMan_nature', 'manWoman_nature', 'twoWoman_nature', 'womanWman_nature', ] # 搜索功能(支持所有字段搜索) search_fields = ['od_number', 'name', 'sex', 'birthday', 'education', 'phone', 'chatNumber', 'address', 'age', 'nature_object', 'nature_number', 'sixNatureNumber', 'many_nature', 'nature_time', 'twoMan_nature', 'manWoman_nature', 'twoWoman_nature', 'womanWman_nature', 'sexnumber', 'mannumber'] # 导出excel功能 actions = ['export_excel'] def export_excel(self, request, queryset): """ 后台导出表单数据,导出格式为excel :param request: :param queryset: :return: """ meta = self.model._meta # 用于定义文件名, 格式为: app名.模型类名 # 模型所有字段名 field_names = [field.name for field in meta.fields] # 响应内容类型 response = HttpResponse(content_type='application/vnd.ms-excel') # 定义响应数据格式 response['Content-Disposition'] = 'FormInfo.csv' # 开始创建excel wb = xlwt.Workbook(encoding='utf-8') # 表名 LST_test = wb.add_sheet('流行病学调查统计表', cell_overwrite_ok=True) # excel中的表头 LST_test.write(0, 0, '序号', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 1, '门诊编号', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 2, '姓名', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 3, '性别', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 4, '出生年月', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 5, '最高学历', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 6, '手机号', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 7, '微信号', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 8, '现居地址', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 9, '初次性行为年龄', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 10, '性行为对象', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 11, '性行为人数', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 12, '近6个月性伴侣人数', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 13, '是否有多人性行为', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 14, '平均性生活时间', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 15, '男-男性方式', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 16, '男-女性方式', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 17, '女-女性方式', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 18, '女-男性方式', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 18, '几人同时', xlwt.easyxf('font: height 240, colour_index red,')) LST_test.write(0, 18, '几男几女', xlwt.easyxf('font: height 240, colour_index red,')) global line global row for obj in queryset: for field in field_names: data = [f'{getattr(obj, field)}'] print(data) LST_test.write(line, row, "".join(data)) row += 1 line += 1 row = 0 wb.save(response) return response export_excel.short_description = '导出为Excel' # 注册表单模型 admin.site.register(FormInfo, WLIndexAdmin) # 注册提交密码模型 admin.site.register(SubmitPassword)
前端页面就不贴了 困了 睡觉!