好的,所以我有这个HTML表单:
<form class="form" action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" value="register">Login</button>
</form>
而这个 Django 视图:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
new_user = form.save()
return HttpResponseRedirect("/success/")
else:
form = UserCreationForm()
return render_to_response("signup.html", {'form': form,}, RequestContext(request))
这工作得很好。但我希望能够更多地自定义原始形式。因此,为了尝试弄清楚如何做到这一点,我首先查看form.as_p函数的源代码,并尝试手动复制它。我最终得到这个:
<form class="form" action="" method="post">
{% csrf_token %}
<p>
<label for="id_username">Username:</label>
<input id="id_username" type="text" name="username" maxlength="30">
</p>
<p>
<label for="id_password1">Password:</label>
<input type="password" name="password1" id="id_password">
</p>
<p>
<label for="id_password2">Password confirmation:</label>
<input type="password" name="password2" id="id_password2">
</p>
<button type="submit" value="register">Login</button>
</form>
但是,这不起作用。我不明白为什么没有。如果form.as_p将上述内容作为输出,那么理论上它应该可以很好地与视图配合使用,不是吗?任何帮助将不胜感激。
您的模板遗漏了两件事:任何表单或字段错误,以及字段的任何预填充值。很明显,is_valid确实是错误的,但你没有显示任何错误。
您应该使用模板变量,而不是在 HTML 中对字段进行硬编码:
{{ form.non_field_errors }}
...
<p>
{{ form.username.label_tag }}
{{ form.username }}
{{ form.username.errors }}
</p>
等。