Флажок Установите несколько (более одного варианта) для связанных моделей с использованием ModelForm - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно написать простое приложение, в котором пользователь может выбрать несколько вариантов (более одного варианта). Я создаю что-то вроде этого:
models.py

from django.db import models

# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    choice_limit = models.PositiveSmallIntegerField(default=1)
    add_date = models.DateTimeField('add date', auto_now_add=True)
    change_date = models.DateTimeField('change date', auto_now=True)
    question_enable = models.BooleanField('is published', default=False)

    def __str__(self):
        return self.question_text


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return "%s %s %s" % (self.question, self.choice_text, self.votes)

views.py

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        #selected_choice = question.choice_set.get(pk=request.POST['choice'])
        some_var = request.POST.getlist('choice')
        selected_2 = Choice.objects.filter(question__in=some_var)
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        for x in selected_2:
            x.votes += 1
            x.save()
        return HttpResponseRedirect("/")

шаблон

<form action="{% url 'vote' question.id %}" method="post">
{% csrf_token %}
    <fieldset>
    <legend>Please select one of the following</legend>
{% for choice in question.choice_set.all %}
    <input type="checkbox" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}
        </fieldset>
<input type="submit" value="Vote">

Я не знаю, что это хороший способ Джанго? Есть ли смысл написать это приложение с ModelForm и общими взглядами? Могу ли я проверить форму по-другому? Я пытаюсь найти некоторые решения, но я только нашел: Поле множественного выбора Django / флажок «Выбрать несколько» встроенный выбор «один ко многим» с администратором django но они не решают мою проблему. Я пытался создать ModelForm, но без какого-либо хорошего результата.

...