from forms.py import PersonCreateForm
class PersonCreateView(CreateView):
model = Person
form_class = PersonCreateForm
template_name = "my_app/create_person.html"
def form_valid(self, form):
self.object = form.save()
return redirect('/homepage/')
class PeopleListView(ListView):
[...]
context.update({
'task_form': TaskCreateForm(),
return context
在我的模板中,我只需添加处理PersonCreateView的动作URL。
<form action="{% url 'people_create' %}" method="post">{% csrf_token %}
当表格有效时,所有数据都会毫无问题地保存,并将其重定向到&#39; / homepage /。
但是当我的表单无效时,它会将我重定向到{% url 'people_create' %}
并在/ homepage / people_create /
我该如何避免?我希望所有错误都显示在同一页面而不重定向。
答案 0 :(得分:3)
在构建它的同一视图上处理表单,否则页面将会更改。您可以将django.views.generic.edit.ModelFormMixin
混合到PeopleListView
中,以便它具有您需要的大部分功能。
class PeopleListView(ModelFormMixin, ListView):
success_url = '/homepage/' # should use reverse() here
def get_context_data(self, **kwargs):
# only add the form if it is not already given to us
if not 'task_form' in kwargs:
kwargs['task_form'] = self.get_form()
return super(PeopleListView, self).get_context_data(**kwargs)
def post(self, request, *args, **kwargs):
# ListView won't have a post method, we define one
form = self.get_form()
if form.is_valid():
return self.form_valid(form) # default behavior will save and redirect
else:
return self.form_invalid(form) # default behavior has to be overridden (see below)
def form_invalid(self, form):
# Whatever you wanna do. This example simply reloads the list
self.object_list = self.get_queryset()
context = self.get_context_data(task_form=form)
return self.render_to_response(context)
在那里,您有三个代码路径:
form_valid
方法,该方法将重定向到/homepage/
。form_invalid
方法,这将正常呈现页面,但表单将包含验证错误。你可以使用表单的缓存属性使整个事情变得更加明确,但是你开始反对Django发布的视图而不是使用它,并且可能只是使用基本View
类并自己实现所有逻辑。我坚持使用Django的观点,但是ymmv。