6.djnago实现问卷调查系统

一、功能实现

1、登录界面

6.djnago实现问卷调查系统

2、表单界面

6.djnago实现问卷调查系统

3、后台界面

6.djnago实现问卷调查系统4、excel导出功能

6.djnago实现问卷调查系统5、过滤器

6.djnago实现问卷调查系统

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)

前端页面就不贴了  困了  睡觉!