Какие наборы запросов могут помочь мне получить результаты, зависящие от двух полей выбора? - PullRequest
0 голосов
/ 06 февраля 2019

В моем проекте много физических вопросов, хранящихся в его базе данных, где каждый из этих вопросов относится к теме физики и типу Вопроса.У меня есть два ChoiceField:
* Один для тем и включает 16 тем.
* Один для типа вопросов и включает два типа вопросов.

У меня есть кнопка отправки, которая должна показывать мнерезультаты моей фильтрации, однако, я не знаю, как написать наборы запросов в views.py, хотя я прочитал документацию, но все еще не знаю, как сделать один или несколько запросов, чтобы получить мои результаты.

Это 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

Это 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
                }

Это 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})

Это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 %}

Любая помощь будет отличной.Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2019

Я не знаю, что именно вы хотите отфильтровать или если я правильно понял (пока не могу добавить комментарии), но вот пример:

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

часть шаблонадля вызова сейчас объяснения запроса

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

: вы фильтруете запрос в своем представлении по .filter (model_field =) в своем шаблоне, вы повторяете все результаты (вы передаете «темы» из представления вшаблон по параметру context в ваших фигурных скобках), отфильтрованный по представлению

...