1

私は次のような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.

シェルでテストクライアントを試してみると、次のようになります。

>>>  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

期待通りの結果が得られました。

4

2 に答える 2

1

あなたのビューコードには奇妙なことがありますが (誤ってカットアンドペーストしたのでしょうか?)、次のコード行から:

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

現在ログインしているユーザーを取得していると思います。テストケースから新しく作成したスーパーユーザーを正しく取得するには、次のようにする必要があります。

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 が作成されなかった理由

ビューから:

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

UserLikes のモデル定義では、Color と Thing に ForeignKey を使用することに注意してください。フォーム内のcolourandは であると推測しているため、実際の Color および Thing オブジェクトを取得する必要があります。thingIntegerField

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 オブジェクトが作成されていることを確認する必要があります。

于 2012-10-23T16:38:28.247 に答える
0

機能した最終的なコード:

tests.py:

class ViewTests(TestCase):
    """
    Run before each test in class
    """
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_superuser(
            'foo',
            'myemail@test.com',
            'pass'
        )
        self.colour = Colour.objects.create(colour='Green')
        self.thing = Thing.objects.create(
            name='Leaf',
            colour=self.colour,
            description='leafy'
        )
        self.logged_in = self.client.login(
            username='foo',
            password='pass'
        )

    """
    Test whether user can login and post choice
    to db and then check if data can be retreived.
    """
    def test_thingpicker(self):
        # check new User object created
        self.assertEqual(User.objects.count(), 1)
        # check use is logged in
        self.assertEqual(self.logged_in, True)  # check login success

        # post some data
        response = self.client.post(
            '/colours/things/', {
            'colour': self.colour.pk,
            'thing': self.thing.pk
            })
        self.assertEqual(response.status_code, 200)

        # check object
        self.assertEqual(UserLikes.objects.count(), 1)
        userlikes = UserLikes.objects.get(
            user=self.user,
            colour_id=self.colour.pk,
            thing=self.thing.pk
        )
        self.assertEqual(userlikes.colour_id, self.colour.pk)
于 2012-10-24T16:57:26.703 に答える