Как сделать так, чтобы не все данные отображались с использованием поля выбора, а только те, которые связаны с полем выбора в Django? - PullRequest
0 голосов
/ 25 февраля 2019

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

Это модель, которую я использую:

    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)
        topic_question = models.ForeignKey('Question',
                                        on_delete=models.CASCADE,
                                        blank=True,
                                        null=True)
        topic_answer = models.ForeignKey('Answer',
                                        on_delete=models.CASCADE,
                                        blank=True,
                                        null=True)
        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_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_description

    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

Этофайл представлений:

    from django.shortcuts import render, render_to_response, redirect
    from .choices import *
    from django.views.generic import TemplateView
    from home.models import Topic, Image, Question, Answer
    from home.forms import TopicForm


    class QuizView(TemplateView):
        template_name = "index.html"

        def get(self, request):
            form = TopicForm()
            args = {"form": form}
            return render(request, self.template_name, args)

        def post(self, request):
            form = TopicForm(request.POST)
            if  form.is_valid():
                form = TopicForm()
            posts = Question.objects.all()
            args = {"form": form, "posts": posts}
            return render(request, self.template_name, args)

Это файл форм:

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

    class TopicForm(forms.ModelForm):

        class Meta:
            model = Topic
            fields = ['topic_name',]

    # 'class': 'home-select-one'

Кстати, как я могу добавить это class в ChoiceField?

Это HTML-файл:

        {% extends 'base.html' %}
          {% block content %}
          <h4>International Baccalaureate Physics</h4>
                <form  method="POST">
                  {% csrf_token %}
                  {{ form.as_p }}
                  <button type="submit" id="home-Physics-time-button">It is Physics Time</button>
                </form>
                {% for post in posts %}
                <table style="margin: 10px auto; width: 90%; line-height: 35px;">
                  <tbody>
                    <tr>
                      <td style = "border: 2px solid #ffffff; padding: 1%;"> <strong>Question:</strong> <br>{{ post.topic_question}}</td>
                    </tr>
                    <tr>
                      <td style = "border: 2px solid #ffffff; padding: 1%;"> <strong>Answer:</strong> <br>{{ post.topic_answer }}</td>
                    </tr>
                  </tbody>
                </table>
                {% endfor %}

            {% endblock content %}

Заранее спасибо!

1 Ответ

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

В вашем view.py вы хотите применить выбор, сделанный в TopicForm правильно?Так что что-то в этом направлении нужно.Вам нужно будет дважды проверить, что именно имеет cleaned_data TopicForm.

from django.shortcuts import render, render_to_response, redirect
from .choices import *
from django.views.generic import TemplateView
from home.models import Topic, Image, Question, Answer
from home.forms import TopicForm


class QuizView(TemplateView):
    template_name = "index.html"

    def get(self, request):
        form = TopicForm()
        args = {"form": form}
        return render(request, self.template_name, args)

    def post(self, request):
        form = TopicForm(request.POST)
        posts = Question.objects.all()
        if form.is_valid():
            # Apply the selected topic as filter on all the posts.
            # TODO: Figure out what the exact value is you get from the form.
            posts = posts.filter(question_topic__topic_name=form.cleaned_data['topic_name'])
        args = {"form": form, "posts": posts}
        return render(request, self.template_name, args)
...