Search code examples
djangodjango-tests

Django test client get row id from query


How can i print the id from the response in the below code.The user does exist in the DB.Also i come across this error.

from django.test import Client

c = Client(enforce_csrf_checks=False)
response = c.post('/reg/_user/', {'firstname': 'test', 'lastname' : '_test'})

views get_user

def _user(request):
  try:
    response_dict = {}
    qd = request.POST
    firstname = qd.__getitem__('firstname')
    lastname = qd.__getitem__('lastname')
    up = UserProfile.objects.get(first_name=firstname,last_name=lastname)
    print up.id
    return up.id
  except:
    pass

Error:

 response = c.post('/reg/_user/', {'firstname': 'test', 'lastname' : '_test'})
 File "/usr/local/lib/python2.7/dist-packages/django/test/client.py", line 483, in post
 response = super(Client, self).post(path, data=data, content_type=content_type, **extra)
 File "/usr/local/lib/python2.7/dist-packages/django/test/client.py", line 302, in post
 return self.request(**r)
 File "/usr/local/lib/python2.7/dist-packages/django/test/client.py", line 444, in request
 six.reraise(*exc_info)
 File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 201, in get_response
response = middleware_method(request, response)
 File "/usr/local/lib/python2.7/dist-packages/django/middleware/clickjacking.py", line 30, in process_response
if response.get('X-Frame-Options', None) is not None:
AttributeError: 'UserProfile' object has no attribute 'get'

Solution

  • The problem is not with your tests, but with the view itself. In Django a view always has to return a HttpResponse object. Sometimes this is achieved using a shortcut function like render(), but it in turn also returns an HttpResponse object.

    If for some reason you just want to return an otherwise empty page with this single value you could change

    return up.id
    

    to

    return HttpResponse(up.id)
    

    Also, I wonder: Did you create the view just to test UserProfile and don't use it as a view on the actual site? If so, this code doesn't belong in a view, it should be put into the unittest itself. You should only use the test client to test actual, real views.


    On an mostly unrelated, but quite important note. This:

    try:
        # your view code
    except:
        pass
    

    is a strong antipattern. Why would you want to silence all the potential problems? You should really stop doing that.