我正在使用Django 1.4和Python 2.7以及Ubunutu 12.04。
我有一个表单会更新用户的个人资料。表单中的最后一项是密码。我使用现有用户的数据预先填充表单。密码字段没有预先填充 - 这没关系。
问题在于,当我“保存”数据时,它会将密码覆盖为空字段或空字段(我无法分辨哪个)。坏。
我该怎么做才能防止这种情况发生?
我试图将其设为必填字段(forms.py
):
password = forms.CharField(widget = forms.PasswordInput(), required = True)
没用。
在更新密码(None
)之前,我已尝试检查密码不是views.py
:
if (request.POST.get('password') is not None):
user.set_password(request.POST.get('password'))
没用。
空表单值是否以None
的形式返回?如果没有,它会返回什么,如何检查它是否为空?
编辑1:
我更新了我的views
以检查验证 - 也许我做错了?
@login_required
def profile(request):
"""
.. function:: profile()
Provide the profile page, where it can be updated
:param request: Django Request object
"""
if request.user.is_authenticated():
user = User.objects.get(username = request.user.username)
user_dict = createUserProfileDict(user)
form = ProfileForm(initial = user_dict);
data = { 'user' : request.user }
data.update({ 'form' : form })
data.update(csrf(request))
if form.is_valid():
return render_to_response("profile.html", data)
现在我收到以下错误:
The view rsb.views.profile didn't return an HttpResponse object.
那么,看来我的表格无效?我怎样才能找出原因?
以下是update_profile view
:
@login_required
def update_profile(request):
"""
.. function:: profile()
provide the profile page
:param request: Django Request object
"""
if request.user.is_authenticated():
user = User.objects.get(username = request.user)
user.first_name = request.POST.get('first_name')
user.last_name = request.POST.get('last_name')
user.email = request.POST.get('email')
if (request.POST.get('password') is not None):
user.set_password(request.POST.get('password'))
user.save()
# Update the additional user information tied to the user
user_info = UserProfile.objects.get(user_id = user.id)
user_info.company_name = request.POST.get('company_name')
user_info.client_type = request.POST.get('client_type')
user_info.address1 = request.POST.get('address1')
user_info.address2 = request.POST.get('address2')
user_info.city = request.POST.get('city')
user_info.state = request.POST.get('state')
user_info.country = request.POST.get('country')
user_info.zip_code = request.POST.get('zip_code')
user_info.phone_number = request.POST.get('phone_number')
user_info.save()
return profile(request)
答案 0 :(得分:1)
首先,请记住控制表单是否为“is_valid()”
如果您的表单是否已提交空值,请使用
MyForm.has_changed()
太糟糕了,这不是一个记录在案的功能:(
如果您需要默认密码,我建议您检查该字段是否有效,然后使用类似
的内容''.join([choice(string.letters + string.digits) for i in range(7)])
为用户生成新密码(范围(7)是您想要的长度)。然后使用选择加入方法(请参阅:向用户发送带有临时密码的电子邮件)
根据新背景进行编辑:
来自django docs的:
If a Field has required=False and you pass clean() an empty value,
then clean() will return a normalized empty value
rather than raising ValidationError.
For CharField, this will be a Unicode empty string.
For other Field classes, it might be None. (This varies from field to field.)
就是这样,你的密码字段应该有必需= False,所以你可以把它当作一个空字符串
然后在你看来你可以这样做:
if input_password != '' and input_password != saved_password:
saved_password = input_password
这只是伪代码,但它应该给你一个明确的想法