공식 장고 투표 자습서는 간단하지만 POST 예외를 수동으로 처리하고 프런트 엔드를 하드 코드해야합니다. 양식을 사용하여 동일한 결과를 얻는 방법?양식을 사용하여 공식 Django Polls 예제를 구현하는 방법은 무엇입니까?
@csrf_protect
def vote(request, question_id):
p = get_object_or_404(Question, pk=question_id)
if request.method == 'GET':
return render(request, 'polls/detail.html', {
'question': p,
})
if request.method == 'POST':
try:
selected_choice = p.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
# Redisplay the question voting form.
return render(request, 'polls/detail.html', {
'question': p,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))
#urls.py
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
#models.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
# polls/templates/polls/detail.html
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>
나는 수행하여 과정을 쉽게 할 :
if form.is_valid():
...
votes += 1
및 {{ form }}
이 Choice.DoesNotExist을 감지하고 기본적으로 오류 메시지를 렌더링 할 수있는 템플릿 {{ form }}
.