Django 中使用多个一对多关联字段动态生成表单

118 阅读2分钟

在 Django 中开发一个测试系统时,用户需要创建包含多个问题的测试,因此需要动态地生成表单以允许用户输入测试信息和问题信息。在示例中,问题模型 Question 和测试模型 Quiz 之间存在一对多的关系,即一个测试可以包含多个问题。如何创建表单、视图和模板来支持动态生成表单并收集用户输入是问题的关键。

huake_00210_.jpg

2、解决方案

为了解决这个问题,可以采取以下步骤:

  1. 创建模型和表单类

    • 创建两个模型类 QuestionQuiz,并为每个模型类定义相应的字段。
    • 为每个模型类创建对应的表单类,以便在模板中渲染表单字段。
  2. 创建视图函数

    • 创建一个视图函数 create_quiz,用于处理用户创建测试的请求。
    • 在视图函数中,使用 render_to_response 函数渲染模板 index.html,并传入两个表单类的实例作为参数。
  3. 创建模板

    • 创建一个模板 index.html,用于呈现表单。
    • 在模板中,使用 {{xquiz.as_table}}{{xquestion.as_table}} 来渲染两个表单,其中 xquizxquestion 是在视图函数中传入的参数。
  4. 处理表单提交

    • 在表单提交时,视图函数会接收表单数据并进行处理。
    • 如果表单数据验证通过,则保存数据并重定向到另一个页面。
    • 如果表单数据验证失败,则重新渲染表单并显示错误信息。

代码示例

# 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 中动态生成包含多个一对多关联字段的表单,从而实现创建测试和问题信息的收集。