2009-03-07 10 views
4

Djangoフォームでは紛失しています。ドキュメントは私が探しているものをカバーしていないようです。一番初歩的なフォームを過ぎてしまえば、少なくともそれはぎこちない停止になるようです。私は良いのドキュメントへのリンク、またはこのトピックをカバーする良い本へのリンクを答えとして喜んで受け取ります。基本的に、これはどのように故障するか、私は3つのモデル(クイズ、質問、回答)を持っています。私はクイズごとに4つの潜在的な回答(多肢選択式)で、20の質問をしています。数字は変わる可能性がありますが、その点は分かります。Django Forms Newbie質問

複数の選択肢のクイズによく似ているように、これらのアイテムのフォームを作成する必要があります。私は、テンプレートに手でフォームを作成するときしかし、むしろdjango.formsを使用するよりも、私は次の取得:

無効なリテラルベース10とのint()のために:「試験」だから、私は

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 
+1

あなたが読んだものを明確にするのではなく、既存のドキュメントをバッシングします。 ModelFormsについて読んだことはありますか? formsets?)、本当にあなたの質問に答える動機が減少します。 –

+1

また、実際の内容を実際に説明する方法で質問に名前を付けると便利です。 –

+0

Carlさん、フォーム上のすべてのドキュメントを読んでいます。はい、すべてです。あなたが非常に基本的なことをしているなら、彼らは素晴らしいです。他の科目は*非常にうまくカバーされています。バッシングは意図されていませんでした。また、質問の良い名前を考えることができませんでした。明らかにあなたを傷つけるために申し訳ありません。 – f4nt

答えて

6

ええ、私はここで実際には不足していることに同意する必要があります。あなたが説明しているケースのためのボックスソリューションは、3つの層に分かれています:クイズ - >質問 - >答えです。

Djangoは、深い2つの層の問題を解決するmodel inline formsetsを持っています。何がしたいフォームを生成するために行う必要がありますすることです。

  1. ロードアップクイズ形式(モデルからちょうどラベルテキストボックス)質問フォームセットA
  2. ロード:QuestionFormSet(クエリセット=質問を。
  3. 質問ごとに、フォームセットをロードする方法とほとんど同じです。
  4. 正しい順序ですべてを保存してください:quiz-> question->答え、各下位レベルはそれ以上の項目の外部キーを必要とするため
2

まず、あなたは、与えられたモデルのためのModelFormを作成します。この例では、私はクイズのためにそれをやっていますが、あなたはすすぎ、あなたの他のモデルのために繰り返すことができます。

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") 

最後に、あなたのテンプレート:あなたのviews.pyにあなたはこのようなものを持っているかもしれませんが、

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 

次:笑いのために、私は「ラベル」を作ってるんだと、プリセットの選択肢と選択ボックスも

<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> 
+0

私はこれに参加します。私が得られないことは、クイズの一部として質問や選択肢を表示する方法です。私が誤解していない限り、これはそれをカバーしていないようです。これはプリセットの選択肢でクイズを表示するだけではありませんか? – f4nt

+0

私はこのサイトがあなたのことを理解するのに役立つと思います:http://djangobook.com/en/1.0/chapter05/とhttp://djangobook.com/en/1.0/chapter07/ – Luis