Her*_*ere 5 django django-forms django-views
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
Run Code Online (Sandbox Code Playgroud)
在我的模板中,我只需添加处理PersonCreateView的动作URL.
<form action="{% url 'people_create' %}" method="post">{% csrf_token %}
Run Code Online (Sandbox Code Playgroud)
当Form有效时,所有数据都保存没有问题,并将其重定向到'/ homepage /.但是当我的表单无效时,它会将我重定向到{% url 'people_create' %}并在/ homepage/people_create /中显示错误
我怎么能避免这种情况?我希望所有错误显示在同一页面而不重定向.
在构建表单的同一视图上处理表单,否则页面将发生变化。您可以混合django.views.generic.edit.ModelFormMixin到您的中PeopleListView,以便它具有您需要的大部分功能。
class PeopleListView(ModelFormMixin, ListView):\n success_url = '/homepage/' #\xc2\xa0should use reverse() here\n\n def get_context_data(self, **kwargs):\n # only add the form if it is not already given to us\n if not 'task_form' in kwargs:\n kwargs['task_form'] = self.get_form()\n return super(PeopleListView, self).get_context_data(**kwargs)\n\n def post(self, request, *args, **kwargs):\n # ListView won't have a post method, we define one\n form = self.get_form()\n if form.is_valid():\n return self.form_valid(form) # default behavior will save and redirect\n else:\n return self.form_invalid(form) # default behavior has to be overridden (see below)\n\n def form_invalid(self, form):\n # Whatever you wanna do. This example simply reloads the list\n self.object_list = self.get_queryset()\n context = self.get_context_data(task_form=form)\n return self.render_to_response(context)\nRun Code Online (Sandbox Code Playgroud)\n\n在那里,您有三个代码路径:
\n\nform_valid将调用该方法,该方法将重定向到/homepage/.form_invalid将调用我们重写的方法,该方法将正常呈现页面,但表单将包含验证错误。您可以使用表单的缓存属性使整个事情变得更加简单,但随后您将开始针对 Django 提供的视图而不是使用它,并且也可能只使用基本类View并自己实现所有逻辑。我会坚持 Django 的观点,但是 ymmv。
| 归档时间: |
|
| 查看次数: |
880 次 |
| 最近记录: |