3

I am trying to retrieve data from db in django. I want to display it in a table. I am getting an error as:\

coercing to Unicode: need string or buffer, TransType found

There are two models in my Models.py file:

class TransType(models.Model):
  name = models.TextField()
  created = models.DateTimeField(auto_now_add = True)
  updated = models.DateTimeField(auto_now = True) 
  def __unicode__(self):
      return self.name

class Trans(models.Model):
  transtype = models.ForeignKey(TransType)
  script = models.CharField(max_length=200)
  created = models.DateTimeField(auto_now_add = True)
  updated = models.DateTimeField(auto_now = True) 
  class Meta:
        unique_together = (("transtype", "script"),)
  def __unicode__(self):
      return self.transtype`

My views.py file

def updatetrans(request):
  json_data=open('/home/ttt/Ali/a.json').read()
  data = json.loads(json_data)
  for pk, pv in data.iteritems():
        for k,v in pv.iteritems():
              try:
                    trans_type = TransType.objects.get_or_create(name=k)
                    trans = Trans()
                    trans.transtype_id = trans_type[0].id
                    if isinstance(pv[k], basestring):
                          script = pv[k]
                    else:
                          print "****** List ****"
                          script = pv[k][1]
                    trans.script = script
                    trans.save()
                    print " Inserted ==>", script
              except Exception, e:
                    print e
                    #print "Not inserted ==>", pv[k][1]
                    pass
  #return HttpResponse("Done")
  info = TransType.objects.all()
  info2 = Trans.objects.all()
  bookdata = { "details" : info, "details" : info2 }
  print bookdata
  return render_to_response("account/updatetrans.html", bookdata, context_instance=Context(request))

My url.py file

url(r'^updatetrans/$', 'booki.account.views.updatetrans', name='updatetrans'),

My updatetrans.html file

{% load i18n %}
<!doctype html>
<html>
<body>

<button type="button" onclick="alert('Hello world!')">Click Me!</button>
<table border="1" style="width:800px">
<tr><td>    
  {% for s in details %}
        {{ s.script }}
  {% endfor %} 
</td> 
<td>     
  {% for n in detail %}
        {{ n.name }}
  {% endfor %} 
</td> 

</tr>

</table>
</body>
</html>

Plz help....

Traceback

Environment: Request Method: GET

enter code here


Django Version: 1.3
Python Version: 2.7.3
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.admin',
 'django.contrib.messages',
 'south',
 'booki.editor',
 'booki.account',
 'booki.reader',
 'booki.portal',
 'booki.messaging',
 'sputnik',
 'booktypecontrol']
 Installed Middleware:
 ('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.middleware.transaction.TransactionMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')

 Traceback:
 File "/home/ttt/abc_booktype/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 111. response = callback(request, *callback_args, **callback_kwargs)

 File "/home/ttt/abc_booktype/Booktype/lib/booki/account/views.py" in updatetrans 808.print bookdata

 File "/home/ttt/abc_booktype/local/lib/python2.7/site-packages/django/db/models/query.py" in __repr__72. return repr(data)

 File "/home/ttt/abc_booktype/local/lib/python2.7/site-packages/django/db/models/base.py" in __repr__370. u = unicode(self)

 Exception Type: TypeError at /accounts/updatetrans/
 Exception Value: coercing to Unicode: need string or buffer, TransType found
1
  • 1
    You need to show the full traceback. Where is that exception happening? Commented Apr 20, 2014 at 10:17

2 Answers 2

4

I got the answer. It is working fine now.

Views.py:

def displaytrans(request):
    TransType.objects.all()
    info = TransType.objects.all()
    info2 = Trans.objects.all()
    print info
    bookdata = { "detail" : info, "details" : info2 }
    print bookdata
    resp =  render_to_response("account/displaytrans.html", bookdata, context_instance=Context(request))
    return resp

displaytrans.html:

<!doctype html>
<html>
  <body>

    <table border="1" style="width:800px">
      <tr>
        <td>  {% for s in details %} </td>
        <td>   {{ s.script }} </td>
      </tr>
      <tr> 
        <td>   {{ s.transtype_id}} </td>
        {% endfor %} 
      </tr>         
    </table>
  </body>
</html>

url.py:

url(r'^displaytrans/$', 'booki.account.views.displaytrans', name='displaytrans'),   
Sign up to request clarification or add additional context in comments.

Comments

0

The traceback shows that the error is coming in your Trans model's __unicode__ method. As the error says, you need to actually return unicode from that method, but you are returning the related TransType.

You could fix this by explicitly converting to unicode in that method:

return unicode(self.transtype)

but you should probably pick a better string representation of your data: there are going to be many Trans objects with the same TransType, so your unicode should distinguish between them, perhaps by also showing the script field.

8 Comments

Thank you.. But now I am getting an error as: TemplateDoesNotExist at /accounts/updatetrans/
Hey, I deleted the file and saved that file in account directory again. And added a button in the file to test. Now The button is displaying but the records are not displayed. There is no error now. I am getting the output on the terminal. But not on the page.
Is there a problem because there are two different tables and I am trying to extract one field from one table and one from another table?
No, it's because your template doesn't actually contain any code to display any fields.
I gave the fields as: {% for script in details %} {% endfor %} {% for name in detail %} {% endfor %}
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.