5

当我想使用简单的 CreateView 创建新用户时遇到问题。一切正常,我可以创建用户,但是当我想用新创建的用户登录时,我做不到。

我在管理员中获得了这种类型的密码:

无效的密码格式或未知的散列算法。

未存储原始密码,因此无法查看此用户的密码,但您可以使用此表单更改密码。

这是我的代码:

模型.py

from django.db import models
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import AbstractUser, UserManager


    class CustomUser(AbstractUser):
        """app setting of user"""
        url = models.URLField(u'Site URL', max_length=100, null=True, unique=True)

    admin.site.register(CustomUser, UserAdmin)

网址.py

from django.conf.urls.defaults import *
from models import CustomUser
from django.views.generic import CreateView
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse

    urlpatterns = patterns('',
                   url(r'^create_user/$',(CreateView.as_view(model=CustomUser,       get_success_url =lambda: reverse('create_user'),
                                                                             template_name="create_user.html")), name='create_user'),
                   )

create_user.html

<div title="Create Form " id="/create_user">
        <p> <b>Create account:</b> </p>            
        {{ form.errors }}
    <form action="" method="post" id="id_create_user" >
        {% csrf_token %}
        {{ form.as_p }}
        <div>
            <input type="submit" value="Create account" style="">
        </div>

    </form>
</div>

创建用户后,我必须以管理员身份登录并更改此密码,之后一切都会好起来的。我的问题示例

我应该怎么做才能解决问题?

谢谢!

4

1 回答 1

7

问题是 CreateView 会根据模型自动生成一个表单,这意味着它直接写入密码字段,而不是使用正确的 API 来创建用户。

请尝试使用此表单,它会为您处理:

from django.contrib.auth.forms import UserCreationForm

urlpatterns = patterns('',
   url(r'^create_user/$',(CreateView.as_view(model=CustomUser, get_success_url =lambda: reverse('create_user'), form_class=UserCreationForm, template_name="create_user.html")), name='create_user'),
)

这些表单本质上与您在管理员中看到的相同,这是一个很好的起点,如果您使用的是自定义用户模型,您可能需要做一些额外的工作来进行自定义。

这是提供的 UserCreationForm 的源代码:https ://github.com/django/django/blob/stable/1.5.x/django/contrib/auth/forms.py#L61-L110

您可以自己将其重新实现为普通的 ModelForm,您必须包含的关键user.set_password是调用的 save 方法。

于 2013-03-12T14:34:57.597 回答