【问题标题】:Django Forms Newbie QuestionDjango 表单新手问题
【发布时间】:2010-10-11 21:22:05
【问题描述】:

好吧,我对 Django 表单一无所知,因为文档似乎并没有完全涵盖我正在寻找的内容。至少,一旦你通过了最基本的形式,它似乎会戛然而止。作为答案,我非常愿意获取 good 文档的链接,或涵盖该主题的好书的链接。基本上,这就是它的分解方式,我有 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

【问题讨论】:

  • 抨击现有文档(与开源文档一样好),而不是澄清你读过哪些文档(即你读过 ModelForms 吗?formsets?),确实降低了回答你的问题。
  • 另外,以实际描述问题内容的方式命名您的问题会很有帮助。
  • Carl,我阅读了表格上的所有文档,是的,所有文档。如果您正在做非常基本的事情,它们会很棒。 非常很好地涵盖了其他主题,只是没有形式。抨击不是故意的。另外,想不出这个问题的好名字。很抱歉冒犯了你。
  • 感谢下面所有回答的人。以下所有答案最终促成了我的解决方案,并教会了我很多。感谢所有帮助窥视!

标签: python django forms


【解决方案1】:

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

Django 有model inline formsets 解决了两层深度的问题。要生成所需的表单,您需要做的是:

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

【讨论】:

    【解决方案2】:

    首先,您为给定的模型创建一个 ModelForm。在此示例中,我正在为 Quiz 执行此操作,但您可以为其他模型冲洗并重复此操作。对于傻笑,我将“标签”设置为带有预设选项的选择框:

    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>
    

    【讨论】:

    • 我得到了其中的一部分。我不明白的是如何在测验中显示问题和选择。这似乎并没有涵盖这一点,除非我只是误解。这不会只显示带有预设选项的测验吗?
    • 我认为这个网站会帮助你解决问题:djangobook.com/en/1.0/chapter05djangobook.com/en/1.0/chapter07
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 2010-10-11
    • 2013-05-03
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多