python - 提交无效表单后如何正确传递 form.errors
问题描述
我创建了一个注册视图,我希望ValidationError
在提交表单后显示它,但它恰好是无效 form.is_valid() == False
的。ChefRegisterationForm
是 的子类UserCreationForm
。如果表单是有效的,就会有一条闪现消息。有了我所拥有的,它可以完成工作,但必须有一种比render
在视图中包含两个语句更简洁的方法。这怎么能被重构以便只有一个render
语句?
def register_chef(request):
if request.method == 'POST':
new_user_form = ChefRegisterationForm(request.POST)
if new_user_form.is_valid():
user = new_user_form.save()
login(request, user)
messages.info(
request,
f"Logged in: {user}!"
)
return HttpResponseRedirect(reverse("menu:menu_list"))
return render(request, 'chef/register_chef.html', {'form': new_user_form})
new_user_form = ChefRegisterationForm()
return render(request, 'chef/register_chef.html', {'form': new_user_form})
{% extends 'index.html '%}
{% block content %}
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<p>{{ error }}</p>
{% endfor %}
{% endfor %}
{% endif %}
<form action="{% url 'chef:register' %}" method="post">
{% csrf_token %}
{% for field in form %}
{{ field }}
{% endfor %}
<button>Register</button>
</form>
{% for key in form.errors %}
{{ key }}
{% endfor %}
{% endblock %}
解决方案
如果我遗漏了什么,请告诉我,但是这个怎么样?
def register_chef(request):
if request.method == 'POST':
new_user_form = ChefRegisterationForm(request.POST)
if new_user_form.is_valid():
user = new_user_form.save()
login(request, user)
messages.info(request, f"Logged in: {user}!")
return HttpResponseRedirect(reverse("menu:menu_list"))
else:
new_user_form = ChefRegisterationForm()
return render(request, 'chef/register_chef.html', {'form': new_user_form})
你可能想看看基于类的 -FormView
我认为 - 会减少你必须编写的样板:
class ChefRegisterView(FormView):
form_class = ChefRegisterationForm
success_url = reverse("menu:menu_list")
template_name = 'chef/register_chef.html'
def form_valid(self, form):
user = new_user_form.save()
login(request, user)
messages.info(request, f"Logged in: {user}!")
return super().form_valid(form)
推荐阅读
- scala - LinearRegressionWithSGD.train “错误:类型不匹配”
- python - 无法在python中绘制二维数据
- c++ - sd-bus 信号不调用 cb 函数
- python - python数据类型覆盖在打印和写入中表现不同
- javascript - bootstrap4输入文件上传不会在输入中显示上传的文件名??如何使用角度解决
- javascript - 处理 Laravel API 时如何设计路由而不是返回 Laravel 视图?
- python - 如何在字典中插入用户输入 - python3
- python - 使用 Python 将所有文件从 SFTP 文件夹下载到带有日期的本地文件夹
- javascript - 禁用 jquery 提交按钮,直到填写所有表单输入
- java - java.lang.SecurityException:“被动”位置提供程序需要 API 级别 26 的 ACCESS_FINE_LOCATION 权限