ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DJango如何为测验构建表单集?

2019-10-23 11:56:26  阅读:87  来源: 互联网

标签:python django django-forms


我正在研究需要显示要参加的测验的测验应用程序
我的模型.py看起来像这样

from django.db import models
from django.contrib.auth.models import User
from django.contrib import admin

#######################
#Quiz Structure Models#
#######################

class Quiz(models.Model):
    name = models.CharField(max_length = 255)
    creation = models.DateField(auto_now_add=True)
    creator = models.ForeignKey(User)

    def __unicode__ (self):
        return self.name

    def possible(self):
        total = 0
        for question in self.question_set.all():
            question.save()
            total += question.value
        return total



class Question(models.Model):
    question = models.CharField(max_length = 255)
    quiz = models.ForeignKey(Quiz)
    creator = models.ForeignKey(User)
    creation = models.DateField(auto_now_add = True)
    #objective = TODO: include standards linking in later versions
    value = models.IntegerField(default = 1)

    def __unicode__(self):
        return self.question

class Answer(models.Model):
    answer = models.CharField(max_length = 255)
    question = models.ForeignKey(Question)
    is_correct = models.BooleanField(default = False)
    #Creator is tied to the quiz


##########
#Attempts#
##########
class QuizAttempt(models.Model):
    student = models.ForeignKey(User)
    quiz = models.ForeignKey(Quiz)
    date = models.DateField(auto_now_add = True)
    #Score Method (similar to possible in Quiz 


class QuestionAttempt(models.Model):
    attempt = models.ForeignKey(QuizAttempt)
    question = models.ForeignKey(Question)
    response = models.ForeignKey(Answer)


#######
#Admin#
#######

class QuestionInline(admin.StackedInline):
    model = Question
    extra = 2


class AnswerInline(admin.StackedInline):
    model = Answer
    extra = 2


class QuizAdmin(admin.ModelAdmin):
    list_display = ('name', 'creator', 'creation', 'possible',)
    search_fields = ('name', 'creator')
    inlines = [QuestionInline]

admin.site.register(Quiz, QuizAdmin)

class QuestionAdmin(admin.ModelAdmin):
    inlines = [AnswerInline]
    search_fields = ('question', 'quiz', 'value',)
    list_display = ('question', 'quiz', 'value',)

admin.site.register(Question, QuestionAdmin)

我正在尝试构建一个表单或表单集,该表单或表单集将使我拥有一个包含所有问题的测验表单,因此它看起来像这样,并将让我重新获得,以保存学生的尝试测验.

>问题1

>选项a
>等

到目前为止,看来我最好的解决方案是从这些模型中构建一个表单集,但是我不确定如何指定我的选择以将其限制为与当前问题相关的答案,或者如何在视图中获取正确的表单集.

解决方法:

如果我正确理解了您的问题,则可能要在执行时创建一个自定义窗体以及许多自定义字段.我期望以下方面:

class QuizForm(forms.Form):
    def __init__(self, data, questions, *args, **kwargs):
        self.questions = questions
        for question in questions:
            field_name = "question_%d" % question.pk
            choices = []
            for answer in question.answer_set().all():
                choices.append((answer.pk, answer.answer,))
            ## May need to pass some initial data, etc:
            field = forms.ChoiceField(label=question.question, required=True, 
                                      choices=choices, widget=forms.RadioSelect)
        return super(QuizForm, self).__init__(data, *args, **kwargs)
    def save(self):
        ## Loop back through the question/answer fields and manually
        ## update the Attempt instance before returning it.

通过管理界面可能需要进行其他调整,但这应该为您在执行时构造表单本身提供一个良好的开端.

您的视图可能看起来像:

# Assuming something like:  /quiz/69/ with "69" being the quiz PK.
def render_quiz(request, quiz_id):
    quiz = get_object_or_404(Quiz, quiz_id)
    form = QuizForm(questions=quiz.question_set.all())
    if request.method == "POST":
        form = QuizForm(request.POST, questions=quiz.question_set.all())
        if form.is_valid(): ## Will only ensure the option exists, not correctness.
            attempt = form.save()
            return redirect(attempt)
    return render_to_response('quiz.html', {"form": form})

标签:python,django,django-forms
来源: https://codeday.me/bug/20191023/1912711.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有