请帮助解决问题。在页面上是一种形式:
from django import forms
from userprofile.models import UserProfile
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.conf import settings
import os
class ChangePasswordForm (forms.Form):
password1 = forms.CharField (widget = forms.PasswordInput ())
password2 = forms.CharField (widget = forms.PasswordInput ())
def clean (self):
cleaned_data = self.cleaned_data
password1 = cleaned_data.get ("password1")
password2 = cleaned_data.get ("password2")
with open (os.path.join (settings.BASE_DIR, "debug_local.txt"), "wb") as f:
f.write (bytes (password1, 'UTF- 8') )
if password1! = password2:
raise forms.ValudationError ("Passwords must be same")
else:
User.set_password (password1)
views.py:
from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.template import loader, RequestContext
from django.core.context_processors import csrf
from userprofile.forms import UserProfileForm
from django.contrib.auth.decorators import login_required
from django.conf import settings
from userprofile.forms import ChangePasswordForm
def custom_proc (request):
return {
'user_profile_show': True,
}
@ login_required
def password_page (request):
t = loader.get_template ('password_page.html')
c = RequestContext (request, {
'form': ChangePasswordForm,
}, [Custom_proc])
return HttpResponse (t.render (c))
password_page.py:
{% Extends "base.html"%}
{% Block title%} User profile - pass {% endblock%}
{% Block content%}
<h2> pass page </ h2>
{% For field in form%}
{{Field.error}}
{% Endfor%}
<form action="/userprofile/" method="POST"> {% csrf_token%}
{{Form.as_p}}
<input type="submit" value="send" />
</ form>
{% Endblock%}
问题是没有工作的功能干净()。我正在尝试将输出调试到文件debug_local.txt值password1。但是这个文件不是写的
答案 0 :(得分:2)
您对清洁功能的缩进是错误的。如果它以这种方式缩进,它只是一个函数,而不是你的类的方法。
class ChangePasswordForm (forms.Form):
password1 = forms.CharField (widget = forms.PasswordInput ())
password2 = forms.CharField (widget = forms.PasswordInput ())
def clean (self):
cleaned_data = self.cleaned_data
password1 = cleaned_data.get ("password1")
password2 = cleaned_data.get ("password2")
with open (os.path.join (settings.BASE_DIR, "debug_local.txt"), "wb") as f:
f.write (bytes (password1, 'UTF- 8') )
if password1! = password2:
raise forms.ValudationError ("Passwords must be same")
else:
User.set_password (password1)
答案 1 :(得分:2)
首先你需要小心你的空白。这部分是您的代码风格,部分复制和粘贴到SO而不重新格式化。无论如何,请查看pep8指南。它们让每个人的生活更轻松。
在您的视图中,您永远不会将POST数据传递给表单,因此永远不会验证用户输入。
完成后,您可以验证表单。
最后,一旦表单有效,您可以设置用户密码
免责声明我写了一个基于功能的视图已经有一段时间了。
view.py
@login_required
def password_page(request):
if requesst.method == 'POST':
form = ChangePasswordForm(request.POST)
if form.is_valid():
request.user.set_password(form.cleaned_data.get('password'))
else
form = ChangePasswordForm()
t = loader.get_template('password_page.html')
c = RequestContext (request, {
'form': ,
}, [Custom_proc])
return HttpResponse (t.render (c))
我已删除表单中更改的密码。就个人而言,我更喜欢这个。
此外,您的clean()
方法必须返回cleaned_data
。
forms.py
def clean (self):
cleaned_data = self.cleaned_data
password1 = cleaned_data.get("password1")
password2 = cleaned_data.get("password2")
# DEBUGGING
# Uncomment this, run your view and head to the
# console to see what is happening
# import pdb; pdb.set_trace()
if password1 != password2:
raise forms.ValudationError ("Passwords must be same")
return cleaned_data