Хо-хо-хо!
Как лучше всего решить следующую проблему?
У меня есть модель раздела, которая содержит множество моделей вопросов, которые содержат несколько моделей выбора:
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,})
То, что я в основном хочу выполнить, - это сохранить весь пользовательский ввод (пользователь должен проверить все переключатели - возможно, позже множественный выбор и текстовые поля) в базу данных.
Все, что он сейчас делает, это перенаправляет меня на пустую страницу / голосование /
Что мне не хватает?
С Рождеством!
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
Похожие вопросы
Новые вопросы
django
Django - это серверная платформа веб-приложений с открытым исходным кодом, написанная на Python. Он разработан для сокращения усилий, необходимых для создания сложных веб-сайтов и веб-приложений, управляемых данными, с особым упором на меньшее количество кода, отсутствие избыточности и более явное, чем неявное.