django编辑配置文件表单不保存



;编辑配置文件";表单在修改时不会保存任何数据。

问题可能出在我的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对象,这样这个测试就可以继续了。在我的计算机上实现了处理测试的代码后,它成功地保存和编辑了用户的数据。

最新更新