Tuesday, May 24, 2011

Re: Trouble with "event_set" syntax

On Tuesday, May 24, 2011 1:51:30 PM UTC+1, Gchorn wrote:
Hi All,

I'm trying to create a website that aggregates information about the
various products made by different companies.  To that end, I have
models (classes) for companies, products, and events.  Since each
company has various products, each product is related to one or more
companies by a ManyToManyKey.  Each product has various news events,
so each event is related to a specific product by ForeignKey as well.

I've used Django's render_to_response shortcut to send a specific
company as a context to a template, in order to render a webpage that
lists all of the products made by that specific company in a table.
Each row in the table is occupied by a different product, and each
column in the table displays a specific piece of info about that
product.  I want the last column to display the most recent news event
object for each product, but I can't figure out how to filter for
this.  I currently have the template set to look like this (I'm
intentionally leaving out some syntax to keep it simple):

for product in company.product_set.all:
<td>{{product.name}}
<td>{{product.usage}}
<td>blah blah blah
<td>{{product.event_set.all}}

And that last line is where I'm stuck.  I want to somehow filter
"product.event_set.all" for the most recent event associated with that
product, but I'm not sure how to do that and I can't find it in the
documentation on the Django website.  One of the attributes of the
"event" class I created is the event date; is there any way to filter
for the most recent date?

Furthermore, I'd like to make a link out of that latest event that
will take you to the full story when you click on it.  (I am setting
up the website to have a webpage for each event object, in which the
full story for the event is displayed.  Each "full-story" page will be
indexed by the id of the event object in question.)  I know the basic
format of this should be:

<td><a href='events/{{event.id}}/'>{{product.event_set.all|
something}}

But I don't know how to set the "id" variable from within the template
so that you're automatically taken to the correct page, and I can't
think of how to set this variable (or context) from the views.py file,
since its value changes for each product listed in the table.

Can anyone help me with this?

cheers,
Gchorn

What you really want to do is to call a method on the Product model which returns the latest event. Actually, there's a built-in queryset function for this, so you just need to give it the field to order by, which you can do by setting `get_latest_by = 'event_date'` (or whatever the field name is) in the Event's inner Meta class.

Then, in the template, you can call that method:

    {% with product.event_set.latest as latest_event %}
        <a href="{% url event latest_event.id %}">{{ latest_event.name }}</a>
    {% endwith %}

A couple of things there - I'm using `with`, as you reference the event twice so that'll avoid two separate db hits; and you should always use the {% url %} tag to look up URLs against your urlconf, rather than hard-coding them.
--
DR.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment