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

Я хочу получить question_description answer_descritption и question_image answer_image, если они найдены в базе данных в соответствии с темой и типом вопроса, используя два ChoiceField для обоих: Тема и Тип вопроса.

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

Это 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)
    answer_topic = models.ForeignKey(    'Topic',
                                    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 TemplateView
from home.models import Topic, Image, Question, Answer
from home.forms import QuizMultiForm




class QuizView(TemplateView):
    template_name = 'index.html'
    def get(self, request):
  # What queries do I need to put here to get the question and answer's description according to the ChoiceField input
        form = QuizMultiForm()
        return render (request, self.template_name, {'form': form})

    def post(self, request):
        form = QuizMultiForm(request.POST)
        if form.is_valid():
            text = form.cleaned_data['topic_name', 'question_type'] # I don't know what to put here!

        args = {'form': form, 'text': text}
        return render (request, self.template_name, args)

Это шаблон:

    {% 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>
              <h1> {{ text }} </h1>
            </form>
        {% endblock content %}

Я бы хотел помочь!Спасибо!

1 Ответ

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

Атрибут cleaned_data формы содержит словарь, который сопоставляет имя поля с ограниченными данными.А из MultiForm документов вы можете прочитать:

cleaned_data

Возвращает OrderedDict cleaned_data для каждой дочерней формы.

Просто извлеките данные так:

topic_name = form.cleaned_data['topics']['topic_name']
question_type = form.cleaned_data['question']['question_type']
# And so on ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...