-1

我将 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)
4

1 回答 1

1

首先,请记住控制您的表单是否为“is_valid()”

要检查您的表单是否已使用空值提交,请使用

MyForm.has_changed()

太糟糕了,这不是一个记录的功能:(

如果您想要默认密码,我建议您检查该字段是否有效,然后使用类似

''.join([choice(string.letters + string.digits) for i in range(7)])

为用户生成新密码(范围(7)是您想要的长度)。然后使用选择加入方法(请参阅:向用户发送带有临时密码的电子邮件)

根据新上下文进行编辑:

来自 django 文档:

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.)

就是这样,你的密码字段应该有required=False,所以你可以把它当作一个空字符串

那么在您看来,您可以这样做:

if input_password != '' and input_password != saved_password:
    saved_password = input_password

这只是伪代码,但它应该给你一个清晰的想法

于 2012-10-16T12:10:12.110 回答