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

Я создаю приложение для опроса / опроса.

  1. Как я могу использовать форму (например, ModelForm) для отображения параметров и переключателя для каждого вопроса на одной странице?(Я прочитал документы, но в настоящее время я не могу создать эффективную ModelForm.)
  2. Как я могу вернуть все выбранные переключатели в представление, нажав одну кнопку отправки?

Я провел день, читая документы, онлайн-статьи и столько ответов, сколько смог найти.Я подозреваю, что есть несколько факторов, которые я пропустил.

Я прибег к написанию страницы с использованием шаблонных тегов.Я хотел бы узнать, как научиться правильно использовать форму django.

models.py

from django.db import models
from django.contrib.auth.models import User


class Collection(models.Model):
    date = models.DateTimeField()

    def __str__(self):
        return 'Collection of questions'


class Question(models.Model):
    question_text = models.CharField(max_length=400)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE, default=None)
    date_published = models.DateTimeField('date published')

    @property
    def options(self):
        options = self.option_set.all()
        return options if options.exists() else 'No options for this question'

    def __str__(self):
        return self.question_text


class Option(models.Model):
    option_text = models.CharField(max_length=400)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.option_text}'


class Answer(models.Model):
    claim_reference_number = models.IntegerField()
    date_selected = models.DateTimeField('date selected')
    chosen_option = models.ForeignKey(Option, on_delete=models.CASCADE)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)

    @property
    def question(self):
        return self.chosen_option.question

    def __str__(self):
        return f'{self.claim_reference_number} selected \'{self.chosen_option}\' in response to \'{self.question}\''

views.py

def new_assessment(request, reference_number):
    collection = Collection.objects.get(pk=1)
    context = {'collection': collection,
               'reference_number': reference_number,
               }
    return render(request, 'ad/templates/new_assessment.html', context)

Template

<h2>New survey</h2>
<form method="POST" action=''>
    {% csrf_token %}
    <div> reference_number = {{ reference_number }}</div>
    {% for question in collection.question_set.all %}
    <h5>{{ question.question_text }}</h5>
        {% for option in question.option_set.all %}
            <p><input type="radio" name="option for {{ question.pk }}" id="option{{ option.pk }}">
            <label for="option{{ option.pk }}">{{ option.option_text }}</label></p>
        {% endfor %}
    {% endfor %}
        <br>
    <button type="submit" class="save btn btn-default" value="selected">Save</button>
</form>

Ниже приведены мои текущие результаты с использованием тегов html и template.Я хотел бы произвести то же самое, используя форму django.

! [Image] https://imgur.com/gizp0rT

1 Ответ

0 голосов
/ 07 мая 2019

Относительно:

1. How may I use a form (such as a ModelForm) to display the options and a radio button for each question on the same page?

Я использовал фабрику форм-моделей с пользовательской формой модели.Это делается следующим образом:

a) Создание пользовательской формы модели в forms.py ( Как добавить настраиваемое поле в форму модели django? ).Чтобы достичь того, чего я хотел, для этого потребовалось использовать класс Meta: определить choices как находящийся во внешнем ключе параметров, связанных с конкретным вопросом;и добавить виджет RadioSelect для каждой опции.

b) Создание набора форм модели.Это включает построение набора форм модели с помощью фабрики наборов форм модели и вашей пользовательской формы модели (https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/)

c) Использование представления для передачи набора форм модели из forms.py (где я создал набор форм модели и пользовательскую форму)к шаблону.

2. How may I return all of the radio button selections to the view by clicking one submit button?

Нажатие кнопки «Отправить» отправляет заполненный набор форм обратно в представления.Как только он прибудет, переберите данные набора форм ( Django обращается к данным набора форм ).Создайте и сохраните соответствующие записи модели в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...