美文网首页
官方教程#4-1-表单

官方教程#4-1-表单

作者: wangfp | 来源:发表于2017-09-15 10:58 被阅读0次
  • 表单模板

<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>
  • 使用'post'方法提交表单

    Whenever you create a form that alters data server-side, use method="post". This tip isn’t specific to Django; it’s just good Web development practice.

  • forloop.counter 返回循环中'for'标签已经被执行过几次
  • 使用'post'方法提交时,需要添加{% csrf_token %}模板标签

  • 表单url

# polls/urls.py

url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote')
# views.vote指定视图函数
# name='vote'则用于模板或者reverse()函数反向找到对应的url

  • 视图函数

# polls/views.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse

from .models import Choice, Question
# ...
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'])
    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:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
  • 在保存了表单提交的数据后,通过HttpResponseRedirect()函数转到指定页面(HttpResponseRedirect()函数只需要一个URL参数)

    As the Python comment above points out, you should always return an HttpResponseRedirect after successfully dealing with POST data. This tip isn’t specific to Django; it’s just good Web development practice.

  • 使用reverse()函数可以避免URL的硬编码。
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
# 其中viewname参数的格式同模板中{% url %}使用的格式相同

  • 展示结果

# polls/views.py

from django.shortcuts import get_object_or_404, render


def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})
# polls/urls.py
url(r'^(?P<question_id>[0-4]+)/results/$, views.results, name='results')
<!--polls/templates/polls/results.html-->

<h1>{{ question.question_text }}</h1>

<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

相关文章

网友评论

      本文标题:官方教程#4-1-表单

      本文链接:https://www.haomeiwen.com/subject/fzbjsxtx.html