2009-03-07 8 views
4

D'accord, je ne sais pas comment utiliser les Django Forms, car la documentation ne semble pas vraiment couvrir ce que je recherche. Au moins, il semble s'arrêter brusquement une fois que vous avez dépassé les formes les plus rudimentaires. Je suis plus que disposé à prendre un lien vers bonne documentation, ou un lien vers un bon livre qui couvre ce sujet, comme une réponse. Fondamentalement, voici comment ça se décompose, j'ai 3 modèles (quiz, questions, réponses). J'ai 20 questions, avec 4 réponses potentielles (multi-choix), par quiz. Les chiffres peuvent varier, mais vous obtenez le point.Django Forms Débutant Question

J'ai besoin de créer un formulaire pour ces articles, un peu comme on s'y attend dans un quiz à choix multiple. Cependant, lorsque je crée la forme à la main dans les modèles, plutôt que d'utiliser django.forms, je reçois le texte suivant:

invalide littérale int() avec la base 10: « test »

Je suis essayer de jouer avec les django.forms, mais je suppose que je ne comprends pas l'idée de la façon de construire une forme appropriée à partir de ceux-ci. Toute aide serait grandement appréciée, merci.

Pour ce que ça vaut la peine ici sont les modèles:

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 les docs existants (qui sont assez bons que les documents open source vont), plutôt que de clarifier ceux que vous avez lus (c.-à-d. avez-vous lu à propos de ModelForms? formsets?), diminue vraiment la motivation pour répondre à votre question. –

+1

En outre, il est utile de nommer votre question d'une manière qui décrit réellement de quoi il s'agit. –

+0

Carl, j'ai lu tous les documents sur les formulaires, oui, tous. Ils sont géniaux si vous faites des choses extrêmement basiques. Les autres sujets sont couverts * extrêmement bien, mais pas les formes. Bashing n'était pas destiné. Aussi, ne pouvait pas penser à un bon nom pour la question. Désolé de t'avoir apparemment offensé. – f4nt

Répondre

6

Ouais je suis d'accord sur la documentation et les exemples font vraiment défaut ici. Ce n'est pas une solution prête à l'emploi pour le cas que vous décrivez, car il va trois couches de profondeur: quiz-> question-> réponse.

Django a model inline formsets qui résolvent le problème pour deux couches profondes. Ce que vous devez faire pour générer la forme que vous voulez est:

  1. Chargez une forme de jeu-questionnaire (juste une zone de texte de l'étiquette de votre modèle)
  2. Charger un une formset question: QuestionFormSet (queryset = Question. objects.filter (quiz = quiz))
  3. Pour chaque question, chargez une réponse de la même manière que vous chargez le jeu de questions
  4. Assurez-vous de tout sauvegarder dans le bon ordre: quiz-> question-> réponse, puisque chaque niveau inférieur a besoin de la clé étrangère de l'élément au-dessus
2

d'abord, vous créez un ModelForm pour un modèle donné. Dans cet exemple, je le fais pour Quiz mais vous pouvez le rincer et le répéter pour vos autres modèles. Pour fou rire, je fais le « label » être une boîte de sélection avec des choix prédéfinis:

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 

Ensuite, dans votre views.py vous pourriez avoir quelque chose comme ceci:

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

Enfin votre modèle ressemblerait à ceci:

<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

J'en fais partie. Ce que je ne comprends pas, c'est comment afficher les questions et les choix dans le cadre d'un quiz. Cela ne semble pas couvrir cela, sauf si je suis juste un malentendu. Cela ne va-t-il pas simplement afficher un quiz avec des choix prédéfinis? – f4nt

+0

Je pense que ce site vous aidera à comprendre les choses: http://djangobook.com/fr/1.0/chapter05/ et http://djangobook.com/fr/1.0/chapter07/ – Luis

Questions connexes