以 10 为基数的 int() 的文字无效:“test”

问题描述 投票:0回答:2

基本上,这就是它的分解方式,我有 3 个模型(测验、问题、答案)。每个测验有 20 个问题,有 4 个可能的答案(多项选择)。数字可能会有所不同,但您明白了。

我需要为这些项目创建一个表单,就像您在多项选择测验中所期望的那样。但是,当我在模板中手动创建表单而不是使用 django.forms 时,我得到以下结果:

以 10 为基数的 int() 的文字无效:'test'

所以我试图弄乱 django.forms,但我想我只是没有掌握如何从中构建正确的表单的想法。

这里值得的是模型:

class Quiz(models.Model):
    label = models.CharField(blank=True, max_length=400)
    slug = models.SlugField()

    def __unicode__(self):
        return self.label

class Question(models.Model):
    label = models.CharField(blank=True, max_length=400)
    quiz = models.ForeignKey(Quiz)

    def __unicode__(self):
        return self.label

class Answer(models.Model):
    label = models.CharField(blank=True, max_length=400)
    question = models.ForeignKey(Question)
    correct = models.BooleanField()

    def __unicode__(self):
        return self.label
python django forms
2个回答
6
投票

是的,我必须同意这里确实缺乏文档和示例。对于您所描述的情况,这不是开箱即用的解决方案,因为它深入三层:测验->问题->答案。

Django 有模型内联表单集,它解决了两层深度的问题。您需要做的是生成您想要的表格:

  1. 加载测验表格(只是模型中的标签文本框)
  2. 加载问题表单集:QuestionFormSet(queryset=Question.objects.filter(quiz=quiz))
  3. 对于每个问题,加载答案表单集的方式与加载问题表单集的方式大致相同
  4. 确保以正确的顺序保存所有内容:测验->问题->答案,因为每个较低级别都需要其上方项目的外键

2
投票

首先,为给定的模型创建一个模型表单。在此示例中,我为测验执行此操作,但您可以对其他模型进行冲洗和重复。为了咯咯笑,我将“标签”设置为带有预设选项的选择框:

from django.models import BaseModel
from django import forms
from django.forms import ModelForm

CHOICES_LABEL = (
    ('label1', 'Label One'),
    ('label2', 'Label Two')

)

class Quiz(models.Model):
    label = models.CharField(blank=True, max_length=400)
    slug = models.SlugField()

    def __unicode__(self):
        return self.label

class QuizForm(ModelForm):
    # Change the 'label' widget to a select box.
    label = forms.CharField(widget=forms.Select(choices=CHOICES_LABEL))

    class Meta:
       # This tells django to get attributes from the Quiz model
       model=Quiz

接下来,在你的views.py中你可能会有这样的内容:

from django.shortcuts import render_to_response
from forms import *
import my_quiz_model

def displayQuizForm(request, *args, **kwargs):
   if request.method == 'GET':
       # Create an empty Quiz object. 
       # Alternately you can run a query to edit an existing object.

       quiz = Quiz()
       form = QuizForm(instance=Quiz)
       # Render the template and pass the form object along to it.
       return render_to_response('form_template.html',{'form': form})

   elif request.method == 'POST' and request.POST.get('action') == 'Save':
       form = Quiz(request.POST, instance=account)
       form.save()
       return HttpResponseRedirect("http://example.com/myapp/confirmsave")

最后你的模板将如下所示:

<html>
  <title>My Quiz Form</title>
  <body>

  <form id="form" method="post" action=".">

   <ul>
    {{ form.as_ul }}
   </ul>

   <input type="submit" name="action" value="Save">
   <input type="submit" name="action" value="Cancel">
  </form>

  </body>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.