Majed Saaeddin
Majed Saaeddin

Reputation: 81

What Query Sets can help me produce results dependent on two Choice Fields?

My project has many physics questions stored in its database where each of these questions belongs to a Physics' topic and a Question type. I have two ChoiceField:
* One for topics and includes 16 topics.
* One for question type and includes two question types.

I have a submit button that is supposed to show me the results of my filtering, however, I don't know how to write the Query Sets in the views.py although I have read the Documentation but still don't know how to make one query or more to get my results.

This is the models.py

            from django.db import models
            from home.choices import *

            # Create your models here.

            class Topic(models.Model):
                topic_name = models.IntegerField(
                                choices = question_topic_name_choices, default = 1)
                def __str__(self):
                    return '%s' % self.topic_name

            class Image (models.Model):
                image_file = models.ImageField()

                def __str__(self):
                    return '%s' % self.image_file

            class Question(models.Model):
                question_type = models. IntegerField(
                                choices = questions_type_choices, default = 1)
                question_topic = models.ForeignKey(    'Topic',
                                                on_delete=models.CASCADE,
                                                blank=True,
                                                null=True)
                question_description = models.TextField()
                question_answer = models.ForeignKey(    'Answer',
                                                on_delete=models.CASCADE,
                                                blank=True,
                                                null=True)
                question_image = models.ForeignKey(    'Image',
                                                on_delete=models.CASCADE,
                                                blank=True,
                                                null=True)

                def __str__(self):
                    return '%s' % self.question_type

            class Answer(models.Model):
                answer_description = models.TextField()
                answer_image = models.ForeignKey(    'Image',
                                                on_delete=models.CASCADE,
                                                blank=True,
                                                null=True)

                def __str__(self):
                    return '%s' % self.answer_description

This is the forms.py

            from django import forms
            from betterforms.multiform import MultiModelForm
            from .models import Topic, Image, Question, Answer
            from .choices import questions_type_choices, question_topic_name_choices

            class TopicForm(forms.ModelForm):
                topic_name      =   forms.ChoiceField(
                                choices=question_topic_name_choices,
                                widget = forms.Select(
                                attrs = {'class': 'home-select-one'}
                                    ))

                class Meta:
                    model = Topic
                    fields = ['topic_name',]
                    def __str__(self):
                        return self.fields


            class QuestionForm(forms.ModelForm):
                question_type =   forms.ChoiceField(
                                choices= questions_type_choices,
                                widget = forms.Select(
                                attrs = {'class': 'home-select-two'},
                                    ))

                class Meta:
                    model = Question
                    fields = ['question_type',]
                    def __str__(self):
                        return self.fields


            class QuizMultiForm(MultiModelForm):
                form_classes    =   {
                            'topics':TopicForm,
                            'questions':QuestionForm
                }

This is the views.py

        from django.shortcuts import render, render_to_response
        from django.views.generic import CreateView, TemplateView
        from home.models import Topic, Image, Question, Answer
        from home.forms import QuizMultiForm

        def QuizView(request):
            if request.method == "POST":
                form = QuizMultiForm(request.POST)
                if form.is_valid():
                    pass
            else:
                form = QuizMultiForm()
            return render(request, "index.html", {'form': form})

This is the index.html

{% extends 'base.html' %} {% block content %}
<form method="POST">
  {% csrf_token %} {{ form.as_p }}
  <button type="submit" id="home-Physics-time-button">
    It is Physics Time</button>
</form>
{% endblock content %}

Any help would be great. Thank you!

Upvotes: 0

Views: 41

Answers (1)

Manko
Manko

Reputation: 91

i dont know what exactly you want to filter or if i understood correctly (cant add comments yet), but here is an example:

views.py

def QuizView(request):
               topics = Topic.objects.filter(topic_name=1) # i dont know your choices, but i go with the set default
                if request.method == "POST":
                    form = QuizMultiForm(request.POST)
                    if form.is_valid():
                        pass
                else:
                    form = QuizMultiForm()
                return render(request, "index.html", {'form': form, 'topics':'topics})

template part for calling now the query

{% for topic in topics %}
<h1> {{ topic.topic_name }} </h1>
{% endfor %}

explanation: you are filtering the query in your view by .filter(model_field=) in your template you iterate trough all results (you are passing 'topics' from the view into the template by the context parameter in your curly brackets), filtered by the view

Upvotes: 1

Related Questions