gpt4 book ai didi

Django - 在测试中获取用户对象

转载 作者:行者123 更新时间:2023-11-28 21:32:54 25 4
gpt4 key购买 nike

我有一个像这样的 models.py:

from django.db import models
from django.contrib.auth.models import User


# everything has a colour...
class Colour(models.Model):
colour = models.CharField(max_length=100)

def __unicode__(self):
return self.colour


# a thing can have a colour...
class Thing(models.Model):
name = models.CharField(max_length=155)
colour = models.ForeignKey(Colour)
description = models.CharField(max_length=255)

def __unicode__(self):
return self.name


# a user can save his choices
class UserLikes(models.Model):
user = models.ForeignKey(User)
colour = models.ForeignKey(Colour)
thing = models.ForeignKey(Thing)

class Meta:
verbose_name_plural = "User Likes"

def __unicode__(self):
return '%d - %s' % (self.pk, self.user)

在我看来:

def ThingPicker(request):
if request.method == 'POST':
form = ThingForm(request.POST)
if form.is_valid():
colour = form.cleaned_data['colour']
thing = form.cleaned_data['thing']
likes = UserLikes(user=request.user, colour=colour, thing=thing)
likes.save()
return HttpResponseRedirect('/profile/')
else:
return render_to_response('thing_picker.html', {
'form': form,
}, RequestContext(request))
else:
form = ThingForm()
return render_to_response('thing_picker.html', {
'form': form,
}, RequestContext(request))

在我的 tests.py 中,我想做这样的事情(已编辑):

class ViewTests(TestCase):
def setUp(self):
self.client = Client()

def test_thingpicker(self):
User.objects.create_superuser('foo', 'myemail@test.com', 'bar')
self.client.login(username='foo', password='bar') # request.user is now user foo

response = self.client.post('/colours/things/', {'colour': 1, 'thing': 2})
userlike = UserLikes.objects.get(pk=1)
self.assertEqual(userlike.colour_id, 1)

我得到一个错误:

DoesNotExist: UserLikes matching query does not exist.

如果我在 shell 中尝试使用测试客户端:

>>>  c = Client()
>>> user1 = User.objects.create_superuser('foo', 'myemail@test.com', 'bar')
>>> c.login(username='foo', password='bar')
>>> c.post('/colours/things/', {'user': user1, 'colour': 1, 'thing': 2})
>>> userlike = UserLikes.objects.get(pk=1)
>>> userlike.colour_id
1L

我得到了预期的结果。

最佳答案

您的 View 代码有些奇怪(意外剪切和粘贴?),但来自以下代码行:

likes = UserLikes(user=request.user, colour=colour, thing=thing)

我猜你得到的是当前登录的用户。要从测试用例中正确获取新创建的 super 用户,您应该这样做:

def test_thingpicker(self):
user1 = User.objects.create_user('foo', 'myemail@test.com', 'bar')

self.client.login(username='foo', password='bar') # request.user is now user foo

response = self.client.post('/colours/things/', {'colour': 1, 'thing': 2})
userlike = UserLikes.objects.get(user=user1, color=1, thing=2)

此外,您应该注意 request.user 可能是 AnonymousUser(请参阅 https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.AnonymousUser ),因此您应该在创建 UserLikes 之前检查用户是否已登录。

您可以使用 @login_required 装饰器 (https://docs.djangoproject.com/en/dev/topics/auth/#the-login-required-decorator) 或手动检查 request.user.is_authenticated() (https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.AbstractBaseUser.is_anonymous)。

为什么没有创建 UserLikes

从 View :

colour = form.cleaned_data['colour']
thing = form.cleaned_data['thing']
likes = UserLikes(user=request.user, colour=colour, thing=thing)

请注意,UserLikes 的模型定义将 ForeignKey 用于 Color 和 Thing。我猜测表单中的 colourthing 是一个 IntegerField,因此您需要检索实际的 Color 和 Thing 对象。

color = Colour.objects.get(pk=form.cleaned_data['colour'])
thing = Thing.objects.get(pk=form.cleaned_data['thing'])
likes = UserLikes(user=request.user, colour=colour, thing=thing)

当然,您需要确保之前已经创建了Color 和Thing 对象。

关于Django - 在测试中获取用户对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13034946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com