1

私はユーザー プロファイルを持っており、ユーザーが自分自身に関するすべて (ユーザー名、パスワード、名前、その他の情報) を更新できるようにしたいと考えています。以下のコードでは、password1 フィールドと password2 フィールドは読み込まれず、clean_username メソッドは呼び出されません。最後に、is_valid メソッドを呼び出すと、常に False が返されますが、エラーは発生しません。

誰でも私を助けることができますか?ありがとうございました。

#forms.py
class UserProfileForm(ModelForm):
    c_user = None
    error_messages = {
        'duplicate_username': _("A user with that username already exists."),
        'password_mismatch': _("The two password fields didn't match."),
    }
    username = forms.RegexField(label=_("Username"), max_length=30,
        regex=r'^[\w.@+-]+$',
        help_text = _("Required. 30 characters or fewer. Letters, digits and "
                      "@/./+/-/_ only."),
        error_messages = {
            'invalid': _("This value may contain only letters, numbers and "
                         "@/./+/-/_ characters.")})

    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        if kwargs.has_key('instance'):
            current_user = kwargs.get('instance').user
            self.c_user = current_user
            self.password1 = forms.CharField(label=_("Password"),
                widget=forms.PasswordInput, required = False)
            self.password2 = forms.CharField(label=_("Password confirmation"),
                widget=forms.PasswordInput, required = False,
                help_text = _("Enter the same password as above, for verification."))
        else: 
            self.password1 = forms.CharField(label=_("Password"),
                widget=forms.PasswordInput)
            self.password2 = forms.CharField(label=_("Password confirmation"),
                widget=forms.PasswordInput,
                help_text = _("Enter the same password as above, for verification."))

    def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        if (self.c_user == None) or (self.c_user.username != username):
            try:
                User.objects.get(username=username)
            except User.DoesNotExist:
                return username
            raise forms.ValidationError(self.error_messages['duplicate_username'])

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1", "")
        password2 = self.cleaned_data["password2"]
        if password1 != password2:
            raise forms.ValidationError(
                self.error_messages['password_mismatch'])
        return password2

    class Meta:
        model = UserProfile
        exclude=('user')

>

#views.py

@csrf_protect
def update_user(request):
    user = request.user
    user_profile = user.get_profile()
    if request.method == 'GET':
        initials = {'username':user.username,
                'email':user.email,
                'name':user_profile.name,
                'birth_date':user_profile.birth_date,
                'weight':user_profile.weight,
                'height':user_profile.height,
                'smoke':user_profile.smoke,
                'drink_alcohol':user_profile.drink_alcohol,
                'alergies':user_profile.alergies,
                }
        form = UserProfileForm(initial=initials)
    elif request.method == 'POST':
        form = UserProfileForm(request.POST, instance=user_profile)
        if form.is_valid():
            f = form.save(commit=False)
            user.username = request.POST.get('username')
            user.save()
            f.user = user
            f.save()
            print request.POST.get('username')
            return redirect('/')
    return render_to_response('profile.html', {'form':form}, context_instance=RequestContext(request))

更新:ありがとう、ダニエル・ローズマン! 現在、フィールド password1 と password2 だけで問題が発生しています。それらはロードされていません。

4

3 に答える 3

1

これはよくあるエラーです。フォームの__init__メソッドの署名を上書きしたため、最初の引数がcurrent_user. したがって、POST ブロックで を使用してフォームをインスタンス化するとUserProfileForm(request.POST, instance=user_profile)、current_user パラメーターに対してデータ ディクショナリが取得され、実際のデータ パラメーターは空になります。空であるため、フォームはバインドされていないため、エラーは発生しません。

フォームをオーバーライドする最良の方法は、または__init__から新しいパラメーターを取得することです。argskwargs

def __init__(self, *args, **kwargs):
    current_user = kwargs.pop('current_user')
    super(UserProfileForm, self).__init__(*args, **kwargs)
    etc.
于 2012-06-08T08:27:26.093 に答える
1

それを試してみてください:

self.fields['password1'] = forms.CharField(label=_("Password"),
            widget=forms.PasswordInput, required = False)
self.fields['password2'] = forms.CharField(label=_("Password confirmation"),
            widget=forms.PasswordInput, required = False,
            help_text = _("Enter the same password as above, for verification."))
于 2012-06-11T20:50:32.730 に答える
0

ビュー定義で{'form':form、}だけではない場合。次に、テンプレートで{{form.as_p}}を使用します

于 2012-06-08T08:04:28.763 に答える