2009-03-07 18 views
4

In Ordnung, ich bin mit den Django Forms ratlos, da die Dokumentation einfach nicht ganz das deckt, wonach ich suche. Zumindest scheint es zu einem quietschenden Halt zu kommen, wenn man an den einfachsten Formen vorbeikommt. Ich bin mehr als bereit, einen Link zu gute Dokumentation oder einen Link zu einem guten Buch, das dieses Thema als Antwort behandelt. Im Grunde, so bricht es zusammen, ich habe 3 Modelle (Quiz, Fragen, Antworten). Ich habe 20 Fragen mit 4 möglichen Antworten (Auswahl) pro Quiz. Die Zahlen können variieren, aber Sie bekommen den Punkt.Django Forms Newbie Frage

Ich muss ein Formular für diese Elemente erstellen, ähnlich wie Sie in einem Multiple-Choice-Quiz erwarten würden. Allerdings, wenn ich die Form von Hand in den Vorlagen erstellen, anstatt django.forms verwenden, erhalte ich folgende:

ungültig wörtliche für int() mit Basis 10: ‚test‘

Also ich bin Ich versuche, mich mit den django.forms herumzuschlagen, aber ich glaube, ich verstehe einfach nicht, wie man aus diesen eine richtige Form aufbauen kann. Jede Hilfe wäre sehr dankbar, danke.

Für was es hier wert sind die Modelle:

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

Bashing die vorhandenen Dokumente (die ziemlich gut als Open Source-Dokumentation gehen), anstatt zu klären, welche Sie gelesen haben (d. H. hast du über ModelForms gelesen? Formsets?), reduziert wirklich die Motivation, Ihre Frage zu beantworten. –

+1

Außerdem ist es hilfreich, Ihre Frage so zu benennen, dass sie tatsächlich beschreibt, worum es geht. –

+0

Carl, ich las alle Dokumente auf den Formularen, ja, alle. Sie sind großartig, wenn Sie extrem einfache Dinge tun. Andere Themen sind abgedeckt * extrem * gut, nur keine Formulare. Bashing war nicht beabsichtigt. Außerdem konnte mir kein guter Name für die Frage einfallen. Entschuldige, dass ich dich offensichtlich beleidigt habe. – f4nt

Antwort

6

Ja, ich muss zustimmen, dass die Dokumentation und Beispiele hier wirklich fehlen. Das ist keine Out-of-the-Box-Lösung für den Fall, den Sie beschreiben, weil es drei Ebenen tief geht: Quiz-> Frage-> Antwort.

Django hat model inline formsets, die das Problem für zwei Schichten tief lösen. Was Sie tun müssen, um das Formular, das Sie erzeugen wollen, ist:

  1. laden ein Quiz Form (nur ein Etikett Textfeld aus Ihrem Modell)
  2. Legen Sie eine eine Frage formset bis: QuestionFormSet (queryset = Frage. objects.filter (quiz = quiz))
  3. Für jede Frage laden Sie eine Antwort formset auf die gleiche Art und Weise wie Sie die Frage laden formset
  4. Stellen Sie sicher, dass Sie alles in der richtigen Reihenfolge speichern: Quiz-> Frage-> Antwort, da jede untere Ebene den Fremdschlüssel des darüber liegenden Artikels benötigt
2

Zunächst erstellen Sie eine Modelform für ein bestimmtes Modell. In diesem Beispiel mache ich es für Quiz, aber Sie können für Ihre anderen Modelle spülen und wiederholen. Für kichert, mache ich das „label“ ein Auswahlfeld mit voreingestellten Optionen sein:

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 

nächste in Ihrem views.py könnten Sie so etwas wie diese:

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

Schließlich Vorlage würde so aussehen:

<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

Ich bekomme einen Teil davon. Was ich nicht verstehe, ist, wie man die Fragen und Entscheidungen als Teil eines Quiz darstellt. Dies scheint das nicht zu erfassen, es sei denn, ich missverstehe nur. Wird dies nicht nur ein Quiz mit voreingestellten Optionen anzeigen? – f4nt

+0

Ich denke, diese Website wird Ihnen helfen, Dinge herauszufinden: http://djangobook.com/en/1.0/chapter05/ und http://djangobook.com/en/1.0/chapter07/ – Luis