On Mon, 12 Feb 2007 05:50:32 +0000, Patrick J. Anderson wrote: > On Mon, 12 Feb 2007 15:32:07 +1100, Malcolm Tredinnick wrote: > >> On Mon, 2007-02-12 at 03:49 +0000, Patrick J. Anderson wrote: >>> I think I might be missing something, but I have a problem with >>> date filter. Why doesn't this template code work? >>> >>> {% ifequal d|date:"l" "Sunday" %} >>> <td class="sunday"> >>> {% else %} >>> <td> >>> {% endifequal %} >>> >>> <ul><li>{{ d|date:"l" }}</li></ul> >>> >>> But inside the HTML list item {{ d|date:"l" }} produces full weekday >>> names. >> >> The Django resolver for template tags is a bit simple-minded about what >> you can pass as arguments: basically either string literals or >> references to variables in the template's context are permitted. What it >> cannot do is taken something that is a context variable modified by a >> filter and work out that value. So Django is failing quietly on the >> first argument there and effectively comparing the empty string to the >> string "Sunday", I suspect. >> >>> Can and should this evaluation be done in such a way, or perhaps >>> there's a better way or no way this can be done using Django templates? >> >> Assuming this is related to your post from a few hours ago about >> determining if it is the first day of the week, I cannot really think of >> any way to do it with the default filters and template tags. A couple of >> possibilities that spring to mind: >> >> (1) If your object had a "is first day of the week" method, you could >> call that. I realise in this case you are probably passing in standard >> Python datetime objects, in which case you are stuck, but maybe "d" is >> something custom that you have control over and create a method that >> returns a boolean. >> >> (2) Write a custom template tag that tests if the date is the first day >> of the week (or equal to another date). It isn't too hard to write >> custom tags and it really is the recommended way for any kind of >> advanced functionality you want to make accessible through the template. >> You could pass the "d" variable and the day of the week to the tag and >> have it act like an if tag if the args were equal (copying the default >> "if" tag from django/templates/defaulttags.py as a starting point is one >> way to start here). >> >> Regards, >> Malcolm >> >> >> >> > Thanks, Malcolm. I see. I didn't know that a Django tag couldn't take a > variable modified by a filter. Thanks for explaining that part. I'll try > to come up with a custom template tag by looking at the docs and Django > built-in tags in the file you mentioned. > > Yes the posts were related, as I'm trying to plot an HTML 28-day calendar > with objects coming from a queryset. It's a little bit challenging with > Python and Django templating, but I'm determined to find a good solution > without resorting to PHP-style mixing of programming logic with > presentation. > > Right now, I can easily create that calendar with dates using a custom tag > I write, but the trick is to properly associate events coming from my > model with the dates coming from context in my template tag. > > Below is the code I wrote so far (inclusion tag and corresponding calendar > template): > > [file:dashboardcalendar.py] > > from datetime import datetime, timedelta > from django.template import Library,Node > > register = Library() > > > def plot_calendar(context): > """ > Plot milestones into an XHTML calendar > > Calendar starts today and ends at the end of day range defined by days > (default = 28) > """ > > week = [datetime.today() + timedelta(days = n) for n in range(7)] > week_days = [d.strftime("%A") for d in week] > > if context.has_key('calendar_milestones'): > milestones = context['calendar_milestones'] > else: > milestones = None > > if not context.has_key('weeks'): > days = int(context['weeks']) * 7 > else: > days = 28 > > dates = [] > > for n in range(days): > date = datetime.today() + timedelta(days=n) > dates.append(date) > > return { > 'week_days': week_days, > 'calendar_days': dates, > 'calendar_milestones': milestones, > } > > register.inclusion_tag('dashboard/widgets/calendar.html', > takes_context = True)(plot_calendar) > > > > [file: calendar.html] > {% if week_days %} > <!-- BEGIN upcoming milestones claendar --> > <table summary="Milestones due in the next 4 weeks" cellspacing='1' > class="calendar"> > <caption>Milestones due in the next 4 weeks</caption> > <thead> > <tr> > {% for w in week_days %} > <th>{{ w }}</th> > {% endfor %} > </tr> > </thead> > > <tbody> > {% if calendar_days %} > {% for d in calendar_days %} > {% if forloop.counter0|divisibleby:7 %} > {% if not forloop.first %}</tr>{% endif %} > {% if not forloop.last %}<tr>{% endif %} > {% endif %} > {% if forloop.first %} > <td class="today"> > <ul><li><strong>TODAY</strong> > <!-- if there are milestones due today, show them here > --> > > {% else %} > <td> > <ul><li>{{ d|date:"j N" }} > {% endif %} > !-- if there are milestones due today, show them here > --> > > </li></ul> > </td> > {% endfor %} > {% else %} > <tr> > <td colspan="7"> > <div class="error">Can't create calendar cells because > I don't know > the date range</div> > </td> > </tr> > {% endif %} > </tbody> > </table> > <!-- END upcoming milestones calendar --> {% endif %} > > <!-- just testing --> > {% if calendar_milestones %} > <ul> > {% for m in calendar_milestones %} > <li>{{ m.date_close|date:"j F" }} | {{ m.name }} ({{ > m.project.name }})</li> > {% endfor %} > </ul> > {% endif %} > > > I created "customfilters.py":
from django.template import Library register = Library() @register.filter("isSunday") def isSunday(var): if var.weekday() == 6: return True return False then in my template {% load customfilters %} ... {% if d|isSunday %}<td class="sunday">{% else %}<td>{% endif %} ... and it worked. Now I need to add checks for a datetime object to 'isSunday' in my custom filter. --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---