Джанго Формы Вопрос Новичка - PullRequest
4 голосов
/ 07 марта 2009

Хорошо, я в недоумении с формами Django, так как документация, похоже, не совсем охватывает то, что я ищу. По крайней мере, он, кажется, останавливается, когда вы проходите через самые элементарные формы. Я более чем готов взять в ответ ссылку на хорошую документацию или ссылку на хорошую книгу, которая освещает эту тему. В принципе, так оно и выходит, у меня 3 модели (викторина, вопросы, ответы). У меня есть 20 вопросов, с 4 потенциальными ответами (с несколькими вариантами ответов) на каждый тест. Числа могут варьироваться, но вы получите точку.

Мне нужно создать форму для этих предметов, так же, как вы ожидаете в тесте с несколькими вариантами ответов. Однако, когда я создаю форму вручную в шаблонах, а не с помощью django.forms, я получаю следующее:

недопустимый литерал для int () с основанием 10: '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

Ответы [ 2 ]

6 голосов
/ 07 марта 2009

Да, я должен согласиться, что документация и примеры здесь действительно отсутствуют. Это нестандартное решение для описываемого вами случая, потому что оно состоит из трех уровней: quiz-> question-> answer.

Django имеет встроенных форм-форм , которые решают проблему для двухслойной глубины. Что вам нужно сделать, чтобы сгенерировать нужную форму:

  1. Загрузить форму теста (просто текстовое поле с меткой из вашей модели)
  2. Загрузить набор форм вопросов: QuestionFormSet (queryset = Question.objects.filter (quiz = quiz))
  3. Для каждого вопроса загружайте набор форм ответов почти так же, как вы загружаете набор форм вопросов
  4. Убедитесь, что вы сохранили все в правильном порядке: викторина-> вопрос-> ответ, поскольку каждому нижнему уровню необходим внешний ключ элемента над ним
2 голосов
/ 07 марта 2009

Сначала вы создаете ModelForm для данной Модели. В этом примере я делаю это для викторины, но вы можете промыть и повторить для других ваших моделей. Для хихиканья я делаю «метку» в поле выбора с предустановленными вариантами:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...