;编辑配置文件";表单在修改时不会保存任何数据。
问题可能出在我的get请求或循环上。当我点击"时,在我的终端上没有显示错误;添加";。它只是重定向到http响应。
我可能也在错误地传递数据。
ediprofile.html
<form method="post">{% csrf_token %} {{form.first_name}} {{form.last_name}} {{form.email}} {{form.phonenumber}} {{form.state}} {{form.next_of_kin}} {{form.dob}} {{form.address}}
<li class="btnn"><button type="submit" class="conf">Add</button></li>
</form>
<h1 class="cer">{{ form.errors.password1 }}{{form.errors.username}}{{form.errors.first_name}} {{form.errors.last_name}} {{form.errors.email}} {{form.errors.phonenumber}} {{form.errors.address}} {{form.errors.password2}}
</h1>
表单.py
class EditProfileForm(UserCreationForm):
first_name = forms.CharField(max_length=100, help_text='First Name')
last_name = forms.CharField(max_length=100, help_text='Last Name')
address = forms.CharField(max_length=100, help_text='address')
next_of_kin = forms.CharField(max_length=100, help_text='Next of kin')
dob = forms.CharField(max_length=100, help_text='Date of birth')
state = forms.CharField(max_length=100, help_text='State')
phonenumber = forms.CharField(
max_length=100, help_text='Enter Phone number')
email = forms.EmailField(max_length=150, help_text='Email')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['email'].widget.attrs.update(
{'placeholder': ('Email')})
self.fields['address'].widget.attrs.update(
{'placeholder': ('Address')})
self.fields['phonenumber'].widget.attrs.update(
{'placeholder': ('Phone number')})
self.fields['first_name'].widget.attrs.update(
{'placeholder': ('First name')})
self.fields['last_name'].widget.attrs.update(
{'placeholder': ('Last name')})
self.fields['dob'].widget.attrs.update(
{'placeholder': ('Date of birth')})
self.fields['state'].widget.attrs.update({'placeholder': ('State')})
self.fields['next_of_kin'].widget.attrs.update(
{'placeholder': ('Next of kin')})
self.fields['first_name'].widget.attrs.update({'class': 'log'})
self.fields['last_name'].widget.attrs.update({'class': 'log'})
self.fields['email'].widget.attrs.update({'class': 'log'})
self.fields['phonenumber'].widget.attrs.update({'class': 'log'})
self.fields['address'].widget.attrs.update({'class': 'log'})
self.fields['dob'].widget.attrs.update({'class': 'log'})
self.fields['state'].widget.attrs.update({'class': 'log'})
self.fields['next_of_kin'].widget.attrs.update({'class': 'log'})
class Meta:
model = User
fields = ('first_name', 'last_name', 'phonenumber',
'email', 'address', 'dob', 'state', 'next_of_kin')
视图.py
def edit_profile(request,id):
profile = Profile.objects.get(user_id=id)
user = get_object_or_404(Profile, pk=id, user=profile.user.id)
if request.method == 'POST':
form = EditProfileForm(request.POST, instance=profile)
if form.is_valid():
form.save()
return redirect(f'/dashboard/profile/{profile.user.slug}/{profile.user.pk}')
else:
return HttpResponse('Could not save')
else:
form = EditProfileForm(instance=user)
args = {'form': form}
return render(request, 'core/editprofile.html', args)
内部
<form method="post">
标签,它错过了动作属性,因此,当你按下提交按钮时,它不会发回表单在你看来,它只是停留在页面上。
若要解决此问题,请将action属性添加到标记中。
示例
<form method="post" action="/url/to/your/view">
2020/10/06扩展代码中另一个错误的答案
在进一步挖掘代码之后。我发现模板遗漏了两个字段。
- 密码1
- 密码2
由于形式继承了";UserCreationForm";这需要";密码1";以及";密码2";字段。因此,在提供这两个字段之前,表单永远不会有效。使用以下示例编辑模板和表单。
示例-模板
<form method="post" action="/url/to/your/view">
...
{{form.password1}}
{{form.password2}}<!-- Add these two fields -->
...
</form>
此外,修改表格
示例-表单
class EditProfileForm(UserCreationForm):
...
class Meta:
model = User
fields = '__all__' # Replace the origin tuple with '__all__' to include all the fields(include password1 and password2)
此外,为了更好地进行bug测试,我修改了部分视图。
示例
def edit_profile(request, id):
# profile = Profile.objects.get(user_id=id) # Since no Profile model provided, I comment it for testing purpose.
# user = get_object_or_404(Profile, pk=id, user=profile.user.id)
user = get_object_or_404(User, pk=id) # Change for testing purpose
if request.method == 'POST':
form = EditProfileForm(request.POST, instance=user)
if form.is_valid():
form.save()
# else:
# return HttpResponse('Could not save')
args = {'form': form}
return render(request, 'ediprofile.html', args) # Instead, return render() will prvoide us rich error message when form is not filled in proporly.
else:
form = EditProfileForm(instance=user)
args = {'form': form}
return render(request, 'ediprofile.html', args)
由于没有提供该代码的用途,我认为它是在编辑";用户";model对象,这样这个测试就可以继续了。在我的计算机上实现了处理测试的代码后,它成功地保存和编辑了用户的数据。