我正在关注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
,对吗?
我在这里看不到什么?
感谢您的帮助。
答案 0 :(得分:2)
是的, gradle eclipse
中的context['action'] = reverse('contacts-edit', kwargs={'pk' : self.get_object().id})
行正在调用自己。此行为views.py
视图生成正确的网址。
这样做是为了contacts-edit
个请求来到同一个视图,即POST
UpdateView
。在那里,将进行适当的处理,即对发送的数据进行表格验证。如果表单有效,则将更新对象。否则,表单将再次显示错误。
UpdateContactView
上的Django文档:
显示用于编辑现有对象的表单的视图, 重新显示带有验证错误的表单(如果有的话)和 保存对象的更改。