django - 这条线在这里实现了什么?

时间:2015-09-22 16:54:10

标签: python html django

我正在关注effectivedjango.com的教程,这是他们的代码:

views.py:

class CreateContactView(CreateView):
    model = Contact
    template_name = 'edit_contact.html'
    fields = '__all__'   #this is needed for error msg Using ModelFormMixin (base class of CreateContactView) without the 'fields' attribute is prohibited.
    def get_success_url(self):
        return reverse('contacts-list')
    def get_context_data(self, **kwargs):
        context = super(CreateContactView, self).get_context_data(**kwargs)
        context['action'] = reverse('contacts-new')   
        return context

class UpdateContactView(UpdateView):
    model = Contact
    template_name = 'edit_contact.html'
    fields = '__all__'
    def get_success_url(self):
        return reverse('contacts-list')
    def get_context_data(self, **kwargs):
        context = super(UpdateContactView, self).get_context_data(**kwargs)
        context['action'] = reverse('contacts-edit', kwargs={'pk' : self.get_object().id})
        return context

urls.py:

url(r'^$', contacts.views.ListContactView.as_view(),
    name='contacts-list',),
url(r'^new$', contacts.views.CreateContactView.as_view(),
    name='contacts-new',),
url(r'^edit/(?P<pk>\d+)/$', contacts.views.UpdateContactView.as_view(),
    name='contacts-edit',),

contact_list.html:

{% block content %}
<h1>Contacts</h1>

<ul>
  {% for contact in object_list %}
    <li class="contact">
      <a href="{{ contact.get_absolute_url }}">{{ contact }}</a>
      (<a href="{% url "contacts-edit" pk=contact.id %}">edit</a>)
    </li>
  {% endfor %}
</ul>

<a href="{% url "contacts-new" %}">Add contact</a>
{% endblock %}

edit_contact.html:

{% block content %}

{% if contact.id %}
<h1>Edit Contact</h1>
{% else %}
<h1>Add Contact</h1>
{% endif %}

<form action="{{ action }}" method="POST">
{% csrf_token %}
<ul>
{{ form.as_ul }}
</ul>
<input id="save_contact" type="submit" value="Save" />
</form>

<a href="{% url "contacts-list" %}">Back to list</a>
{% if contact.id %}
<a href="{% url "contacts-delete" pk=contact.id %}">Delete</a>
{% endif %}
{% endblock %}

为什么context['action'] = reverse('contacts-edit', kwargs={'pk' : self.get_object().id})中的行views.py看起来像是在调用它自己?

我的意思是,在contact-edit模板中按下提交按钮时会调用此操作,对吗?所以它从那里开始,它本身就是反向调用contact-edit,对吗?

我在这里看不到什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

是的, gradle eclipse中的context['action'] = reverse('contacts-edit', kwargs={'pk' : self.get_object().id})行正在调用自己。此行为views.py视图生成正确的网址。

这样做是为了contacts-edit个请求来到同一个视图,即POST UpdateView。在那里,将进行适当的处​​理,即对发送的数据进行表格验证。如果表单有效,则将更新对象。否则,表单将再次显示错误。

UpdateContactView上的Django文档:

  

显示用于编辑现有对象的表单的视图,   重新显示带有验证错误的表单(如果有的话)和   保存对象的更改。