Хо-хо-хо!

Как лучше всего решить следующую проблему?

У меня есть модель раздела, которая содержит множество моделей вопросов, которые содержат несколько моделей выбора:

class Section(models.Model):
    section_text = models.CharField(max_length=255)
    section_description = models.TextField(blank=False)
    slug = models.SlugField(unique=True, null=True)

    def __unicode__(self):
        return self.section_text

    def save(self, *args, **kwargs):
        self.slug = slugify(self.section_text)
        super(Section, self).save(*args, **kwargs)


class Question(models.Model):
    section = models.ForeignKey(Section)
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __unicode__(self):
        return self.question_text


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

ModelForm остается простой, так как я просто хочу изменить количество голосов:

class ChoiceForm(ModelForm):
    class Meta:
        model = Choice
        fields = ['votes']

Не уверен, следует ли передавать pk, question_id или slug в url:

url(
    #regex=r'^(?P<question_id>\d+)/$',
    #regex=r'^(?P<slug>[-\w]+)/$',
    regex=r'^vote/$',
    view=vote,
    name='vote'
),

В HTML я показываю все вопросы + варианты, которые принадлежат разделу (через question_list):

{% if question_list %}      
    <form action="{% url 'polls:vote' %}" method="post">    
    {% for question in question_list %}
        <fieldset>
            <legend>{{ question.question_text }}</legend>
            {% csrf_token %}
            {% for choice in question.choice_set.all %}
                <input type="radio" name="{{ question.id }}" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
                <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
            {% endfor %}
        </fieldset>
    {% endfor %}
        <input class="button small" type="submit" value="Weiter" />
    </form>
{% endif %}

Наконец, вид. Вот не совсем уверен, что елку делаю:

class SectionOverview(ListView):
    model = Section
    context_object_name = 'section_list'
    template_name = 'itbarometer/umfrage.html'

def vote(request):
    if request.method == 'POST':
        form = ChoiceForm(request.POST)
        if form.is_valid():
            f.save()
            return HttpResponseRedirect('polls:thanks')
    else:
        form = ChoiceForm()

    return render(request, 'polls:detail', {'form': form,})

То, что я в основном хочу выполнить, - это сохранить весь пользовательский ввод (пользователь должен проверить все переключатели - возможно, позже множественный выбор и текстовые поля) в базу данных.

Все, что он сейчас делает, это перенаправляет меня на пустую страницу / голосование /

Что мне не хватает?

С Рождеством!

0
wendy_winter 24 Дек 2013 в 17:35

1 ответ

Лучший ответ

Вы неправильно используете свои представления, шаблоны или формы. Постарайтесь, чтобы все было просто. Начнем с формы.

Ваша форма

Вам следует отредактировать отдельные поля, чтобы они отражали то, как вы хотите, чтобы они были представлены в шаблоне. Например, если вы хотите, чтобы пользователи выбирали вопросы из раскрывающегося списка, вы должны сделать следующее в своей ModelForm. Обратите внимание, что это можно получить из самой БД, но это для иллюстративных целей.

QUESTION_CHOICES=(
('text saved in DB', 'Question 1'),
('text saved in DB', 'Question 2'),
)

class MyModel(ModelForm):
questions = forms.ChoiceField(choices=QUESTION_CHOICES)

class Meta:
    model = MyModel

Полезные ссылки Создание ModelForms Указание виджетов Работа с формами

Ваш шаблон

После того, как вы заполните форму модели, вам нужно будет только отправить ее экземпляр в шаблон. Другими словами, ваш шаблон будет выглядеть примерно так:

<html>
  <body>
    <form method="post">
    {% csrf_token %}
      {{ form }}
      <input id="save_question" type="submit" value="Save" />
    </form>
  </body>
</html>

Ваше мнение

Похоже, вы пытаетесь смешать представления на основе функций с представлениями на основе классов. Предполагая, что вы намеревались использовать представления на основе классов, нет необходимости создавать функцию get_vote. Вместо этого переопределите функции get () и post (). Когда класс вызывается, он автоматически определяет, является ли это запросом GET или POST. Вот вам пример.

def post(self, request, *args, **kwargs):
    self.object = self.get_object()
    form=self.get_form(self.get_form_class())
        if form.is_valid():
            return self.form_valid(form)
    else:
        return self.form_invalid(form)

Полезные ссылки Классный CBV Использование / создание представлений Пример ListView

0
chirinosky 24 Дек 2013 в 18:11
Спасибо за вклад.
 – 
wendy_winter
26 Дек 2013 в 00:09