用户 ModelForm 没有保存在数据库中(Django)
User ModelForm not getting saved in database (Django)
我有一个创建自定义用户实例的 ModelForm(AbstractUser 模型)。每当我尝试提交表单时,除了重新加载页面(由于操作)之外什么都没有发生,并且数据库中没有任何内容。代码如下:
def sign_up(request):
if request.method == 'POST':
print("test")
form = UserForm(request.POST)
if form.is_valid():
form.save()
data = form.cleaned_data
user = authenticate(
username=data['username'],
password=data['password']
)
user_login(request, user)
else:
form = UserForm()
return render(request, 'schedules/signup/signup.html', {'form':form})
class ClientUser(AbstractUser):
classes = models.ManyToManyField(ScheduleClass)
personal_changes = models.TextField(name="personal_changes", default="none")
schedule = models.ManyToManyField(Schedule)
def get_classes(self):
return self.classes
class UserForm(forms.ModelForm):
class Meta:
model = ClientUser
fields = ['username', 'password', 'classes', 'schedule']
<form method="post" action="http://127.0.0.1:8000/">
{% csrf_token %}
{{ form }}
<input type="submit">
</form>
出于某种原因,即使我 post,它也不会打印我在 sign_up
函数的第 3 行写的那一行。我做错了什么吗?
好的,所以你说你的印刷品没有显示,所以首先让你的表单操作与网站相关,在这里使用 django 的 {% url
模板标签通常是个好主意,或者只是将其留空到 post 到当前 URL;
<form method="post" action="">
{% csrf_token %}
{{ form }}
<input type="submit">
</form>
现在,如果您使用 POST 请求点击视图并且表单无效,那么当页面再次呈现时,您此时正在做的事情将不会包含任何错误,因此它'看起来好像什么都没发生,但实际上您确实尝试验证表单,您只是没有 return 向用户报告错误。
调用 form.is_valid()
后,如果 form
实例无效,则会向该实例添加错误。因此,表单实例的状态非常重要,您需要将其传回给用户,而不是创建一个新实例,这就是您消除错误的方式。
你会做这样的事情;
def sign_up(request):
# Create the form for a GET request
form = UserForm()
if request.method == 'POST':
# Recreate the form instance with the POST data
form = UserForm(request.POST)
# Run form validation
if form.is_valid():
form.save()
data = form.cleaned_data
user = authenticate(
username=data['username'],
password=data['password']
)
user_login(request, user)
# if you end up here on a POST request, the form isn't valid but still contains the errors
return render(request, 'schedules/signup/signup.html', {'form':form})
我有一个创建自定义用户实例的 ModelForm(AbstractUser 模型)。每当我尝试提交表单时,除了重新加载页面(由于操作)之外什么都没有发生,并且数据库中没有任何内容。代码如下:
def sign_up(request):
if request.method == 'POST':
print("test")
form = UserForm(request.POST)
if form.is_valid():
form.save()
data = form.cleaned_data
user = authenticate(
username=data['username'],
password=data['password']
)
user_login(request, user)
else:
form = UserForm()
return render(request, 'schedules/signup/signup.html', {'form':form})
class ClientUser(AbstractUser):
classes = models.ManyToManyField(ScheduleClass)
personal_changes = models.TextField(name="personal_changes", default="none")
schedule = models.ManyToManyField(Schedule)
def get_classes(self):
return self.classes
class UserForm(forms.ModelForm):
class Meta:
model = ClientUser
fields = ['username', 'password', 'classes', 'schedule']
<form method="post" action="http://127.0.0.1:8000/">
{% csrf_token %}
{{ form }}
<input type="submit">
</form>
出于某种原因,即使我 post,它也不会打印我在 sign_up
函数的第 3 行写的那一行。我做错了什么吗?
好的,所以你说你的印刷品没有显示,所以首先让你的表单操作与网站相关,在这里使用 django 的 {% url
模板标签通常是个好主意,或者只是将其留空到 post 到当前 URL;
<form method="post" action="">
{% csrf_token %}
{{ form }}
<input type="submit">
</form>
现在,如果您使用 POST 请求点击视图并且表单无效,那么当页面再次呈现时,您此时正在做的事情将不会包含任何错误,因此它'看起来好像什么都没发生,但实际上您确实尝试验证表单,您只是没有 return 向用户报告错误。
调用 form.is_valid()
后,如果 form
实例无效,则会向该实例添加错误。因此,表单实例的状态非常重要,您需要将其传回给用户,而不是创建一个新实例,这就是您消除错误的方式。
你会做这样的事情;
def sign_up(request):
# Create the form for a GET request
form = UserForm()
if request.method == 'POST':
# Recreate the form instance with the POST data
form = UserForm(request.POST)
# Run form validation
if form.is_valid():
form.save()
data = form.cleaned_data
user = authenticate(
username=data['username'],
password=data['password']
)
user_login(request, user)
# if you end up here on a POST request, the form isn't valid but still contains the errors
return render(request, 'schedules/signup/signup.html', {'form':form})