1、问卷的保存按钮
前端通过ajax把数据发过来后端处理数据,然后返回给前端
2、对问卷做答
首先用户进行登录,验证
条件:1、只有本班的学生才能对问卷做答
2、已经参加过的不能再次访问
在前端显示的样式
显示当前问卷的问题
- 你对近期的学习有哪些意见、。?
1 2 3 4 5 。。 10
- 路宁女朋友一些建议?
文本...
- 路宁选择帽子颜色?
A. 绿色 B.翠绿
C. 墨绿 D.深绿色
问卷的保存按钮涉及到的知识点:
集合的操作:
s = [1,4,5,8] s2 = [2,4,7,8,6] print(set(s).difference(s2)) #做差集,在s中找和s2不同的元素 {1, 5} print(set(s2).difference(s)) #做差集,在s2中找和s不同的元素 {2, 6, 7} print(set(s)-set(s2)) #这种方式和上面的一样 {1, 5} print(set(s2)^set(s)) #交集 {1, 2, 5, 6, 7} print(set(s2)|set(s)) #并集 {1, 2, 4, 5, 6, 7, 8}
思路分析:
拿到前端的数据,像下面这种格式的
如果是json格式发的,注意要在request.body中取值。
ajax_post_list = [
{
'id': 2,
'caption': "鲁宁爱不是番禺??",
'tp': 1,
},
{
'id': None,
'caption': "八级哥肾好不好?",
'tp': 3
},
{
'id': None,
'caption': "鲁宁脸打不打?",
'tp': 2,
"options": [
{'id': 1, 'name': '绿', 'score': 10},
{'id': 2, 'name': '翠绿', 'score': 8},
]
},
]
前端的数据和数据库的数据进行比较,
- 前端有后端没有要添加
- 前端没有后端有要删除
- 前端有后端也有要更新
#数据库中的那些问题id需要删除(数据库里有前端没有的数据删除)采用集合操作,求差集
del_id_list = set(question_id_list).difference(post_id_list) #del_id_list就是要删除的id
循环前端发过来的数据,得到数据依次进行比较,
#判断前端传进来的id不在数据库里面,就说明要新增
#如果发过来的ty_id是2(单选)的时候,也要新增
#否则就是要更新
#更新的时候注意也要判断一下ty_id,如果没有的话就的吧数据库的删除了,如果有的话
#就先吧数据库的删除了,然后创建更新
问卷的问卷做答涉及到的知识点:
1、创建类的两种方式
方式一:
class Foo(object):
x1=5
def func(self,arg):
return arg
方式二:
Foo = type('Foo',(object,),{"x1":5,"func":lambda x:x})
有与Python中一切皆对象,所以累也是一个对象,它是type的对象,所以这里就可以实例化
这里的三个参数分别是,:类名,继承的类,字典里面可以放静态属性也可以放方法等。
2、split切割
s = "aaaa_ssss_ddd"
print(s.split("_")) #['aaaa', 'ssss', 'ddd']
print(s.split("_",1)) #['aaaa', 'ssss_ddd'] #这里的参数1代表式按第一个下划线分割
print(s.rsplit("_",1)) #['aaaa_ssss', 'ddd'] #rsplit表示从右边的第一个下划线分割
3、Form前端循环
views.py
class LoginForm(Form):
name = ...
pwd = ...
def login(request):
form = LoginForm()
return render(request,"login.html")
login.html
不用循环实现的、
<div>
{{ form.name }} {{ form.errors.name.0 }}
{{ form.aee }} {{ form.errors.age.0 }}
</div>
用循环实现的、
<div>
{% for item in form %}
{{ item.label }}{{ item }}{{ item.errors.0 }}
input框前的文字----每个input框----错误提示
{% endfor %}
</div>
4、自定义Form验证规则
def func(val):
if len(val) < 15:
raise ValidationError('你太短了')
class LoginForm(Form):
name1和name2是一样的,只是两种表示的方式
name1 = fields.CharField(label='xxx', widget=widgets.Textarea, validators=[RegexValidator(regex=""),])
name2 = fields.RegexField(label='xxx', widget=widgets.Textarea, regex="xxx")
如果上面的验证不满足你需求的时候,可以用这一种。
注意: validators=[func, ]这里的func函数不加(),Form会自动找到这个函数去运行它
name3 = fields.CharField(label=que.caption, widget=widgets.Textarea, validators=[func, ])
也可以自己去定义钩子函数去验证
def clean_name1(self,val):
return val
具体操作:
首先用户得先登录
#先判断哪些人可以答卷
查看当前登录用户是否是要评论的班级的学生
models.Student
如果不是就返回无权访问,
#是否已经提交过当前问卷的答案
#展示当前问卷下的所有的问题