在 Django 中开发一个测试系统时,用户需要创建包含多个问题的测试,因此需要动态地生成表单以允许用户输入测试信息和问题信息。在示例中,问题模型 Question 和测试模型 Quiz 之间存在一对多的关系,即一个测试可以包含多个问题。如何创建表单、视图和模板来支持动态生成表单并收集用户输入是问题的关键。
2、解决方案
为了解决这个问题,可以采取以下步骤:
-
创建模型和表单类:
- 创建两个模型类
Question和Quiz,并为每个模型类定义相应的字段。 - 为每个模型类创建对应的表单类,以便在模板中渲染表单字段。
- 创建两个模型类
-
创建视图函数:
- 创建一个视图函数
create_quiz,用于处理用户创建测试的请求。 - 在视图函数中,使用
render_to_response函数渲染模板index.html,并传入两个表单类的实例作为参数。
- 创建一个视图函数
-
创建模板:
- 创建一个模板
index.html,用于呈现表单。 - 在模板中,使用
{{xquiz.as_table}}和{{xquestion.as_table}}来渲染两个表单,其中xquiz和xquestion是在视图函数中传入的参数。
- 创建一个模板
-
处理表单提交:
- 在表单提交时,视图函数会接收表单数据并进行处理。
- 如果表单数据验证通过,则保存数据并重定向到另一个页面。
- 如果表单数据验证失败,则重新渲染表单并显示错误信息。
代码示例
# models.py
from google.appengine.ext import db
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
class Quiz(db.Model):
title = db.StringProperty(required=True)
created_by = db.UserProperty()
date_created = db.DateTimeProperty(auto_now_add=True)
class Question(db.Model):
question = db.StringProperty(required=True)
answer_1 = db.StringProperty(required=True)
answer_2 = db.StringProperty(required=True)
answer_3 = db.StringProperty(required=True)
correct_answer = db.StringProperty(choices=['1', '2', '3', '4'])
quiz = db.ReferenceProperty(Quiz)
# forms.py
from django.newforms import Form
from django.newforms import MultipleChoiceField
from models import Question, Quiz
class QuestionForm(Form):
question = MultipleChoiceField(choices=[
('1', 'Answer 1'),
('2', 'Answer 2'),
('3', 'Answer 3'),
('4', 'Answer 4'),
])
class QuizForm(Form):
title = MultipleChoiceField(choices=[
('1', 'Quiz 1'),
('2', 'Quiz 2'),
('3', 'Quiz 3'),
])
# views.py
from google.appengine.ext.db.djangoforms import ModelForm
from django.shortcuts import render_to_response
from models import Question, Quiz
from django.newforms import Form
def create_quiz(request):
xquestion = QuestionForm()
xquiz = QuizForm()
return render_to_response('index.html', {'xquestion': xquestion, 'xquiz': xquiz})
# index.html
Please Enter the Questions
<form action="" method='post'>
{{xquiz.as_table}}
{{xquestion.as_table}}
<input type='submit'>
</form>
通过上述解决方案,您可以在 Django 中动态生成包含多个一对多关联字段的表单,从而实现创建测试和问题信息的收集。