更改电子邮件和密码的表单

时间:2015-11-25 12:18:57

标签: python django

我想写一个表格,显示用户的电子邮件,但允许他们通过输入当前密码和新密码两次来更改密码。我也想使用ModelForm

我有User

# models.py
class User(AbstractBaseUser):
    email = models.EmailField(unique=True)

我已经开始表格了:

# forms.py
class ChangeAccountDetailsForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email',)

    current_password = forms.CharField(widget=forms.PasswordInput)
    password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)

我创建了一个简单的视图,该视图仅适用于当前的GET请求:

# views.py
def edit_account_details(request):
    if request.method == 'GET':
        account_form = ChangeAccountDetailsForm()
        return render(request, 'freelancestudent/edit_account_details.html', {
            {'form': account_form}
        })
    else:
        pass

一个简单的HTML文件,只需调用{{form.as_p}}即可。当我按原样运行时,我在unhashable type: 'dict'收到错误{'form': account_form}。然后,我如何显示当前用户的电子邮件并允许更改密码的功能。这可能是使用ModelForm还是我必须自己滚动表格并自己完成所有逻辑?

1 个答案:

答案 0 :(得分:1)

这里:

return render(
   request, 
  'freelancestudent/edit_account_details.html', {
            {'form': account_form}
        })

你有两套{}。内部定义dict,外部定义set,因此它等同于:

context = {'form': account_form}
whatever = set(context)

现在sets需要它们的值可以清除(就像dict个键一样),并且dict不可清除,因此您的错误信息。

但无论如何:render期望dict,而不是set,所以你想要的是:

return render(
   request, 
  'freelancestudent/edit_account_details.html', 
  {'form': account_form}
  )