django hacks: accesing a model.field verbose_name...
September 2022
Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
This site is an effort to share some of the base knowledge I have gathered through all this years working with Linux, FreeBSD, OpenBSD, Python or Zope, among others. So, take a look around and I hope you will find the contents useful.
Recent Entries
Recent Comments
Recent Trackbacks
OpenBSD (9 items)
BSD (0 items)
FreeBSD (19 items)
Linux (3 items)
Security (3 items)
Python (22 items)
Zope (13 items)
Daily (144 items)
e-shell (9 items)
Hacks (14 items)
PostgreSQL (3 items)
OSX (8 items)
Nintendo DS (0 items)
enlightenment (0 items)
Apache (3 items)
Nintendo Wii (1 items)
Django (24 items)
Music (12 items)
Plone (7 items)
Varnish (0 items)
Lugo (2 items)
Sendmail (0 items)
europython (7 items)
Cherokee (1 items)
self (1 items)
Nature (1 items)
Hiking (0 items)
uwsgi (0 items)
nginx (0 items)
cycling (10 items)
Networking (1 items)
DNS (0 items)

Syndicate this site (XML)

RSS/RDF 0.91

08 mayo

django hacks: accesing a model.field verbose_name...

...directly within a view.

My first django hack, imagine you have a model like:

class Project(models.Model):

    """ A sample django model """

    name = models.CharField('Project name', max_length=250)
    start_date = models.DateField('Project started on')
    employee = models.CharField('Project associated to', max_length=250)

    def __unicode__(self):

    class Admin:
        list_display = ('name', 'start_date', 'employee')
        list_filter = ['employee']
        search_fields = ['name']

    class Meta:
        ordering = ['-start_date']
        verbose_name_plural = 'Projects';

Once we have our model, we can play with it through a python shell. In order to do that, we have to use the shell command of

snowball:SomeProject wu$ python shell

This way, all the neccesary deps from django will be pre-loaded and we will end in a python console running inside our project environment. Then, we can do something like:

Python 2.5.2 (r252:60911, Apr 29 2008, 23:50:14)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from SomeProject.iapm.models import Project
>>> p = Project.objects.all()[0]
>>> p
<Project: francisco_2008_03>

Here, I've imported the Project model, which is a class, then I created an instance of that class getting some data from the database (the first entry in the projects list) and using such data to populate the attributes of the model's class (name, start_date and employee).

Next, I called the instance itself, which will call the __unicode__ method, which will return a unicode object contaning the project name.

Of course, I could check the different attributes of the instance, like the name:


or the employee:

>>> p.employee

With that, I got the value for each attribute but, what if I would like to show something like:

Atribute: value

Each field object have two attributes, name and verbose_name, that will show the name of the field when called. The problem appeared when I tried to access those attributes directly:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'unicode' object has no attribute 'name'
>>> p.employee.verbose_name
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'unicode' object has no attribute   'verbose_name'

What happened here? Well, it is pretty easy to understand. When I called p.responsable what I got in return is an unicode object, which doesn't have nor a name attribute, neither a verbose_name attribute.

Well, thnx to theju in the #django irc channel ( I found a workaround:

>>> p._meta.get_field('responsable').verbose_name
'Responsable de proyecto'

Here, I called the get_field method to get a field object, which does have a verbose_name attribute. Easy, isn't it?

So I finally got something like:

>>> print p._meta.get_field('employee').verbose_name + ': ' + p.employee
Project associated to: Wu

Of course that could be used inside a view to, for example, create a list of empty attributes from a given model.

Posted by wu at 16:54 | Comments (0) | Trackbacks (0)
<< OpenBSD 4.3 released | Main | Diagnostic-Code: SMTP; 571 Denied by policy >>
Re: django hacks: accesing a model.field verbose_name...

This does not work inside of a template (e.g. as headers or labels for object data):

"Variables and attributes may not begin with underscores: 'object._meta.get_field"

Any ideas?!

Posted by: Derek at febrero 22,2010 19:09
Re: django hacks: accesing a model.field verbose_name...

Hi Derek. Yes, django template system does not allow you to access methods beginning with _, which in the end should be "private" in python (so I think it is good it doesn't). Perhaps the quickest solution would be to create a template filter, that given that object, returns the info, something like:

def get_object_field(object):
return object._meta.getfield # put here whatever you would like to return
get_object_field = register.filter(get_object_field)

Then, within the template, you could do something like:

{{ object|get_object_field }}

(Of course you will have to create your own filters module, take a look here to know how:

Hope that helps!

Posted by: Wu at febrero 24,2010 09:10
Re: django hacks: accesing a model.field verbose_name...

Thanks for this tip - it answered my question exactly!

Posted by: Ash at marzo 04,2010 05:17
Re: django hacks: accesing a model.field verbose_name...

instead of:
p = Project.objects.all()[0]

p = Project

otherwise it will fail if the model doesn't have any instances.

Posted by: Steve R. Jones at septiembre 26,2010 10:17
Please send trackback to:
There are no trackbacks.
Post a comment