我已经为我的项目实现了用户注册,并且我确实能够从Django shell客户端中找到使用User.objects.get()创建的对象。Django测试客户端不会创建用户对象,但会创建一个匿名用户对象
但是在运行测试时,似乎创建了AnonymousUser对象而不是User对象。
我有以下代码;
forms.py;
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserCreateForm(UserCreationForm):
"""
Extends Django's UserCreationForm
"""
email_exists_message = "A user with that email id already exists."
email = forms.EmailField(required=True)
first_name = forms.CharField(required=True)
last_name = forms.CharField()
class Meta:
model = User
fields = ("first_name", "last_name", "username", "email", "password1", "password2")
def clean_email(self):
email = self.cleaned_data["email"]
try:
User._default_manager.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError(
self.email_exists_message,
code='duplicate_email',
)
def save(self, commit=True):
user = super(UserCreateForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
user.first_name = self.cleaned_data["first_name"]
user.last_name = self.cleaned_data["last_name"]
if commit:
user.save()
return user
urls.py;
.
.
.
from stationrunner.forms import UserCreateForm
.
.
urlpatterns = patterns('',
url('^registration/',
CreateView.as_view(template_name='auth/register.html',
form_class=UserCreateForm,
success_url='/stations/create'
),
name='userregistration'
),
.
.
.
)
and finally my tests.py;
from django.test import TestCase
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
class TestUserSignUp(TestCase):
.
.
.
def test_submission_form_creates_user_object(self):
"""
Tests if submission of the form on page for creation of a
user creates a user object and its attributes take the
expected values
"""
first_name = "somename"
last_name = "somename"
email = "[email protected]"
username = "someusername"
password = "somepassword"
response = self.client.post(reverse("userregistration"),
{"first_name": first_name,
"last_name": last_name,
"email": email,
"username": username,
"password": password},
follow=True)
assert "user" in response.context
user = response.context["user"]
assert user.first_name == first_name
assert user.last_name == last_name
assert user.email == email
assert user.username == username
assert user.password == user.set_password(password)
如上用户对象说确实得到保存到数据库和我进一步确信它使用userobject.is_authenticated()从Django的壳
但是当我运行我的测试,我得到以下故障
> assert user.first_name == first_name
stationrunner/tests.py:145:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7f815ac211d0>>, args = ('first_name',)
def inner(self, *args):
if self._wrapped is empty:
self._setup()
> return func(self._wrapped, *args)
E AttributeError: 'AnonymousUser' object has no attribute 'first_name'
我是新手到Python/Django和我非常期待着有人向我解释这是怎么发生的
阿夫扎尔
更新;
我导入了身份验证并登录到了我的forms.py,并将save()方法改为看起来像;
def save(self, commit=True):
user = super(UserCreateForm, self).save(commit=False)
user.email = self.cleaned_data["email"]
user.first_name = self.cleaned_data["first_name"]
user.last_name = self.cleaned_data["last_name"]
if commit:
user.save()
authenticate(username=user.username, password=user.password)
log_user_in(user)
return user
并添加了预期的log_user_in()方法为;
def log_user_in(self, user):
login(self.request, user)
我试图登录用户,因此期望我的response.context不包含匿名用户对象,但包含用户对象本身。
但代码似乎不起作用。我仍然得到同样的错误。正如已经说过的我是一个新手,所以请原谅,如果有任何愚蠢。
非常感谢您的时间。请检查更新。 –
这是你的实际代码?我在问,因为你在'UserCreateForm.save'中调用'log_user_in(user)',但是这个方法需要两个参数。 –
log_user_in也是一个类的方法(类UseCreateForm本身)。它需要的第一个参数是类的对象。 –