django hacks: accesing a model.field verbose_name...
May 2017
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 31      
About
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
Categories
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 (9 items)
Networking (1 items)
DNS (0 items)
Archives

Syndicate this site (XML)

RSS/RDF 0.91

08 mayo
2008

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):
        return self.name

    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 manage.py:

snowball:SomeProject wu$ python manage.py 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.
(InteractiveConsole)
>>> 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:

>>> p.name
u'francisco_2008_03'

or the employee:

>>> p.employee
u'Wu'

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:

>>> p.employee.name
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 (irc.freenode.net) 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 14:54 | Comments (0) | Trackbacks (0)
<< OpenBSD 4.3 released | Main | Diagnostic-Code: SMTP; 571 Denied by policy >>
Comments
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 18: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: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/)

Hope that helps!

Posted by: Wu at febrero 24,2010 08: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 04:17
Re: django hacks: accesing a model.field verbose_name...

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

use:
p = Project

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

Posted by: Steve R. Jones at septiembre 26,2010 08:17
Trackbacks
Please send trackback to:http://blog.e-shell.org/66/tbping
There are no trackbacks.
Post a comment