2010-03-03 2 views
0

Я пытаюсь сделать что-то довольно простое, но я новичок в Django. У меня установлена ​​система викторины для эксперимента, который я запускаю.Получение информации обо всех связанных объектах в django

Соответствующие записи в models.py следуют:

class Flavor(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
    return self.name 

class Passage(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
    return self.name 

class PassageText(models.Model): 
    passage = models.ForeignKey(Passage) 
    flavor = models.ForeignKey(Flavor) 
    contents = models.TextField() 

    def __unicode__(self): 
    return "[%s#%s]" % (self.passage, self.flavor) 

class Question(models.Model): 
    passage = models.ForeignKey(Passage) 
    text = models.TextField() 

    def __unicode__(self): 
    return "[%s#%s]" % (self.passage, self.text) 

class AnswerOption(models.Model): 
    question = models.ForeignKey(Question) 
    text = models.TextField() 
    is_correct = models.BooleanField(default=False) 

    def __unicode__(self): 
    return "[%s#%s]" % (self.question, self.text) 

class TestSubject(models.Model): 
    GENDER_CHOICES = (('M','Male'), ('F','Female'),) 
    EDUCATION_CHOICES = (('SH', 'Some high school'), ('HS', 'High school diploma'), ('SC', 'Some college'), ('CD', 'College degree'), ('MD', 'Master\'s degree'), ('PH','PhD or higher education'),) 
    GPA_CHOICES = (('1', '1.0-1.5'), ('2', '1.5-2.0'), ('3', '2.0-2.5'), ('4', '2.5-3.0'), ('5', '3.0-3.5'), ('6', '3.5-4.0'), ('7', '4.0-4.5'), ('8', '4.5-5.0'),) 

    ip = models.CharField(max_length=30) 
    completed = models.BooleanField(default=False) 
    created_time = models.DateTimeField(default=datetime.now) 
    time_used = models.IntegerField(default=0, help_text='number of seconds used for test') 

    age = models.PositiveIntegerField() 
    gender = models.CharField(max_length=2, choices=GENDER_CHOICES) 
    education = models.CharField(max_length=2, choices=EDUCATION_CHOICES) 
    school = models.CharField(max_length=200) 
    grad_year = models.PositiveIntegerField() 
    gpa = models.CharField(max_length=2, choices=GPA_CHOICES) 
    sat_verbal = models.PositiveIntegerField(blank=True) 
    sat_math = models.PositiveIntegerField(blank=True) 
    sat_writing = models.PositiveIntegerField(blank=True) 
    sat_overall = models.PositiveIntegerField(blank=True) 
    english_is_your_first_language = models.BooleanField() 
    kerberos_name_if_applying_for_900_credit = models.CharField(max_length=200, blank=True) 

    def __unicode__(self): 
    return "[%s#%s]" % (self.ip, self.created_time) 

class TestSequence(models.Model): 
    subject = models.ForeignKey(TestSubject) 
    order = models.IntegerField(help_text='1..n') 
    pt = models.ForeignKey(PassageText) 
    time_used = models.IntegerField(default=0, help_text='number of seconds used for test') 

    def __unicode__(self): 
    return "[%s#%d]" % (self.subject, self.order) 

class QuestionSequence(models.Model): 
    tseq = models.ForeignKey(TestSequence) 
    order = models.IntegerField(help_text='0..n') 
    question = models.ForeignKey(Question) 
    selectedanswer = models.ForeignKey(AnswerOption, blank=True, null=True, default=None) 

    def __unicode__(self): 
    return "[%s#%d]" % (self.tseq, self.order) 

Я хочу, чтобы по существу есть страница, которая просто дает мне таблицу всех объектов TestSubject (и все их свойства), а также перечень которых проходы, которые они сделали, и количество вопросов, которые они получили в этом отрывке.

+2

Вы ищете кого-нибудь, чтобы запрограммировать вам решение? С какими аспектами вашего вопроса вы столкнулись с наибольшей проблемой, является ли доступ к данным или представляет их пользователю? Ваш вопрос может быть более конкретным. –

+0

Я не ищу кого-нибудь, чтобы закодировать мне решение, извините. Полагаю, я должен уточнить, о чем я не понимаю: я могу пропустить все объекты TestSubject в views.py или передать их список в шаблон, но если я прокручу их в шаблоне, я не понимаю, как это сделать как получить соответствующие отрывки и ответы для каждого тестового объекта. –

ответ

0

Ну, так как никто не помог вам еще здесь:

# *snip* -- view: 
context = { 'test_subjects' : TestSubject.objects.all() } 
return render_to_response('Template', context) 
# *snip* 

# *snip* -- template: 
{% for test_subject in test_subjects %} 
{{ test_subject.ip }} 
{# ... snip ... #} 
{% empty %} 
There are no test subjects. 
{% endfor %} 

во-вторых, он более предпочтителен, чтобы передать список «вещей» в шаблон, и пусть это сделать волшебство .. если у вас нет особых причин не делать этого. Передача их в виде строки путем «преобразования» и «объединения» их в представление разрушает разделение между данными и кодом и делает ваши взгляды «грязными».

Для получения дополнительной информации по этому вопросу, гласил: Views, Templates и Models

На стороне записки, я думаю, было бы лучше, если бы вы переосмыслили некоторые части вашего дизайна модели, я вижу некоторую избыточность там. Хранение имени испытуемого было бы хорошей и удобной для пользователя идеей. Наконец, не должно быть flavour? Даже если вы не измените его в своем коде, вы можете захотеть его для британских англоговорящих.

+0

Я полностью согласен с прохождением списка «вещей» в шаблон. Я не могу сохранить имя, поскольку оно должно быть анонимной викториной. Эта часть (список испытуемых) - это часть, которую я уже имел. Я не понимаю, как заставить шаблон перечислять каждый проход для каждого предмета, например. И затем, как получить счет правильных ответов для каждого отрывка для каждого предмета. Имеют смысл? –

+0

@michael: no. Я предполагаю, что вы хотите показать каждому тесту несколько вопросов и хотите проверить ответы и оценить их? (Если это то, что вы хотите, то будьте более конкретным о своей проблеме, что вы пробовали до сих пор). Во-вторых, о каких ответах вы говорите? – aviraldg

Смежные вопросы