python – Django,UserChangeForm错误

我正在制作一个自定义用户表单,用户可以在其中更改一些细节.它有两个错误,我无法理解问题是什么.

第一个问题是表单没有填写用户详细信息.这似乎是因为表单初始化时self是空的,为什么?

第二个问题是,当我提交此表单时,它会抱怨一些KeyError,我也没有.我已经粘贴了代码和堆栈跟踪.

追溯

Environment:


Request Method: POST
Request URL: http://localhost:8000/settings/

Django Version: 1.4
Python Version: 2.7.2
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'social_auth')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "c:\tools\python27\lib\site-packages\django-1.4-py2.7.egg\django\core\handlers\base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "c:\tools\python27\lib\site-packages\django-1.4-py2.7.egg\django\contrib\auth\decorators.py" in _wrapped_view
  20.                 return view_func(request, *args, **kwargs)
File "C:\xampp\htdocs\tddd27_project\contact\views.py" in settings
  47.       if form.is_valid():
File "c:\tools\python27\lib\site-packages\django-1.4-py2.7.egg\django\forms\forms.py" in is_valid
  124.         return self.is_bound and not bool(self.errors)
File "c:\tools\python27\lib\site-packages\django-1.4-py2.7.egg\django\forms\forms.py" in _get_errors
  115.             self.full_clean()
File "c:\tools\python27\lib\site-packages\django-1.4-py2.7.egg\django\forms\forms.py" in full_clean
  270.         self._clean_fields()
File "c:\tools\python27\lib\site-packages\django-1.4-py2.7.egg\django\forms\forms.py" in _clean_fields
  290.                     value = getattr(self, 'clean_%s' % name)()
File "c:\tools\python27\lib\site-packages\django-1.4-py2.7.egg\django\contrib\auth\forms.py" in clean_password
  122.         return self.initial["password"]

Exception Type: KeyError at /settings/
Exception Value: 'password'

views.py

def settings(request):

    if request.method == 'POST':
        form = UserProfileForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponse("Change success")
    else:
        form = UserProfileForm(instance=request.user)
    return render_to_response('settings.html',{'form': form}, context_instance=RequestContext(request))

forms.py

class UserProfileForm(UserChangeForm):

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name')
        exclude = ('password',)

    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        if self.instance  and self.instance.pk:
            self.fields['username'] = self.instance.username
            self.fields['first_name'] = self.instance.first_name
            self.fields['last_name'] = self.instance.last_name

模板

{% extends "base.html" %}

{% block title %}
    Settings
{% endblock title %}

{% block content %}
 {{ user.username }}
    <form action="" method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="submit">
    </form>
{% endblock content %}

最佳答案 关于你的第二个问题,我今天也遇到了同样的问题,同时从Django 1.3更新到Django 1.4.我有一个像你一样的自定义表单:

class UserProfileForm(UserChangeForm):
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', )

我通过添加如下的clean_password方法解决了这个问题:

class UserProfileForm(UserChangeForm):
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', )

    def clean_password(self):
        return "" # This is a temporary fix for a django 1.4 bug
点赞