-1

Python 2.7 および Ubunutu 12.04 で Django 1.4 を使用しています。

ユーザーのプロファイルを更新するフォームがあります。フォームの最後の項目はパスワードです。フォームに既存のユーザーのデータを事前入力します。パスワード フィールドは事前入力されません。それで問題ありません。

問題は、データを「保存」すると、パスワードが上書きされて null または空のフィールドになることです (どちらかわかりません)。悪い。

これを防ぐにはどうすればよいですか?

必須フィールド ( ) にしようとしました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ますか? そうでない場合、それは何として返され、空かどうかを確認するにはどうすればよいですか?

views編集1:検証を確認するために私のものを更新しました-多分私はこれを間違っていましたか?

@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)])

ユーザーの新しいパスワードを生成します (range(7) は必要な長さです)。次に、オプトイン方法を使用します (参照: ユーザーに一時パスワードを記載した電子メールを送信します)。

新しいコンテキストに基づいて編集:

ジャンゴのドキュメントから:

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 に答える