I've just come up with what looks like a rather ugly solution for
certain problem, and I'm hoping someone might have comments for
improvement.
I've got a Book model, with a M2M relationship with an Author model,
ie possibly several authors per book. In my book template, I wanted to
use a for loop to produce output like so:
One author: "This book is by John Doe."
Two authors: "This book is by John Doe and Jane Doe."
Three or more authors: "This book is by John Doe, Jane Doe, Eustace
Tilley, [more] and Fred"
After much screwing around with for loops in the view and in the
template, I eventually decided to construct a mini-template using a
function in the views.py file. It looks like this (item is the book
object, and it has an author field):
======
def makeAuthChunk(item):
authCount = item.author.count()
if authCount == 1:
auth = item.author.all()[0]
authChunk = """<a href="%s">%s</a>""" %
(auth.get_absolute_url(), auth)
elif authCount == 2:
auth1 = item.author.all()[0]
auth2 = item.author.all()[1]
authChunk = """<a href="%s">%s</a> and <a href="%s">%s</a>"""
% (auth1.get_absolute_url(), auth1, auth2.get_absolute_url(), auth2)
else: # ie, more than 2 authors
firstAuth = item.author.order_by("id")[0]
lastAuth = item.author.order_by("-id")[0]
otherAuth =
item.author.all().exclude(pk=firstAuth.pk).exclude( pk=lastAuth.pk)
authChunk = """<a href="%s">%s</a>""" %
(firstAuth.get_absolute_url(), firstAuth)
for auth in otherAuth:
authChunk += """, <a href="%s">%s</a>""" %
(auth.get_absolute_url(), auth)
authChunk += """ and <a href="%s">%s</a>""" %
(lastAuth.get_absolute_url(), lastAuth)
return authChunk
=====
Hope the formatting survives. I have two questions:
1. Is there really no easier way to do this?
2. I'm up against the negative indexing problem in getting the last
author, and while the negative order_by seems okay, given that id is
unique, I'm wondering if there is a better way to accomplish that.
Any suggestions or alternative solutions would be much appreciated...
Thanks,
Eric
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---