Thanks, Steve. I'll implement this today and see what happens.

On Aug 16, 9:46 pm, Steve Holden <[email protected]> wrote:
> On 8/16/2010 10:30 PM, Nick Tankersley wrote:> Thank you again for your 
> replies. They've been full of usefull
> > information about how to clean up an otherwise pretty sloppy bit of code.
>
> No problem. I hope you don't mind me keeping this dialog on the list (I
> see you didn't copy django-users, perhaps not realizing that a "Reply
> All" would be required to do so).
>
> > By the way, type 1 races passed about a month ago so it doesn't come
> > into play.
>
> Thanks! That cleared up a mystery.
>
> > I can see how you misunderstand my goal. After I get the initial query
> > for the races I want to filter each races candidate_set to include only
> > those candidates with a specific status. That is where I am getting stuck.
>
> > What I meant by saying that the template for loop is working properly is
> > that based on my flawed query logic it is returning exactly what is
> > should, a list of candidates in the last entry.
>
> Ah! Penny drops! I wasn't really looking at the templates. So what you
> are really asking is how can you make the template work for every race,
> and not just the last one?
>
> A solution I have used in the past is to add attributes to the top-level
> objects that I can then use in the template. This would in your case
> involve doing something like
>
>     for race in state_races:
>         race.cands = race.candidate_set.filter(status="runoff")
>
> in the view. Then the template would look like this:
>
> {% for race in state_races %}
>
> {{race.name}} - {{race.type}}
>
> {% for cand in race.cands %}
> {{ cand.name }} - {{cand.id }}
> {% endfor %}
>
> {% endif %}
>
> I am pretty sure this isn't the recommended way to proceed, but with
> luck someone on the list will advise us as to what is ...
>
> regards
>  Steve
>
>
>
> > On Aug 16, 2010 9:21 PM, "Steve Holden" <[email protected]
> > <mailto:[email protected]>> wrote:
> >> On 8/16/2010 9:30 PM, Nick wrote:
>
> >>> Thanks for the reply.
>
> >>> I assume the problem is coming from the views since the template 'for'
> >>> loop is technically doing what it's supposed to.
>
> >> I find that hard to believe - you appear to be saying that you only want
> >> the candidates for the *last* state_race. In which case why bother to
> >> compute the candidates for the others?
>
> >> As far as I can see your code
>
> >> for race in state_races:
> >> candidates = race.candidate_set.filter(status="runoff")
>
> >> should give exactly the same result at
>
> >> candidates = state_races[-1].candidate_set.filter(status="runoff")
>
> >> but of course I could be mistaken.
>
> >> Ignoring that for the moment you might want to simplify a little bit -
> >> it looks as though you were heading along this road but didn't quite go
> >> all the way.
>
> >> racetypes = {"2": "runoff",
> >> "3": "general"} # What happened to "1"?
>
> >> def races_output(request, rtyp) # type() is a Python built-in!
> >> r = racetypes(rtyp)
> >> t = loader.get_template("Government/race_output_%s.html" % rtyp)
> >> state_races = Race.objects.select_related().filter(type=rtyp)
> >> # then whatever you decide needs to be done with the races
>
> >> Hope this helps.
>
> >> regards
> >> Steve
>
> >>> How do I limit the candidate_set(s) for each race to the statuses
> >>> mentioned above? I have a very duct taped solution in my template but
> >>> it's very unwieldly and confusing (many many if's). Can I move this
> >>> filtering to the view to clean up the template?
>
> >> That's almost certainly the right approach. Whenever your templates get
> >> clogged up with logic it indicates you need to migrate the logic to
> >> views. This makes your templates much more readable too!
>
> >>> On Aug 16, 7:41 pm, Steve Holden <[email protected]
> > <mailto:[email protected]>> wrote:
> >>>> On 8/16/2010 5:40 PM, Nick wrote:
>
> >>>>> I have a view that handles elections/races. That view takes a request
> >>>>> object and then based on that object sends the information to a
> >>>>> specific template.
>
> >>>>> For each election/race there is a subset of candidates based on the
> >>>>> initial candidate_set from that race. I would like to know how to
> >>>>> filter that set in a view. Here is what I have so far:
>
> >>>>> Models.py:
>
> >>>>> Candidate
> >>>>> name = charfield
> >>>>> id = integer
> >>>>> race = ForeignKey(Race)
>
> >>>>> Race
> >>>>> name = charfield
> >>>>> type = integerfield
>
> >>>>> Views.py
>
> >>>>> def races_output(request, type): # the type is a number that equates
> >>>>> to general (3), runoff (2) or primary (1)
> >>>>> if type == 2:
> >>>>> r = "runoff"
> >>>>> t = loader.get_template("Government/race_output_2.html")
> >>>>> state_races = Race.objects.select_related().filter(type=type)
> >>>>> for race in state_races:
> >>>>> candidates = race.candidate_set.filter(status="runoff")
>
> >>>>> if type == 3:
> >>>>> r = "general"
> >>>>> t = loader.get_template("Government/race_output_3.html")
> >>>>> state_races = Race.objects.select_related().filter(type=type)
> >>>>> for race in state_races:
> >>>>> candidates = race.candidate_set.filter(status="general")
>
> >>>>> c = Context({'state_races': state_races, 'candidates': candidates,
> >>>>> 'r':r})
> >>>>> html = t.render(c)
>
> >>>>> template
>
> >>>>> {% for race in state_races %}
>
> >>>>> {{race.name <http://race.name>}} - {{race.type}}
>
> >>>>> {% for cand in candidates %}
> >>>>> {{ cand.name <http://cand.name> }} - {{cand.id <http://cand.id> }}
> >>>>> {% endfor %}
>
> >>>>> {% endif %}
>
> >>>>> The problem is the candidate for loop returns the exact same
> >>>>> candidates for every single race. How do I get it so that the
> >>>>> candidates query is specific to the race in the for loop?
>
> >>>> First of all, note that you are setting candidates in a for loop. So
> >>>> what you see is only the result of the last iteration of that loop - the
> >>>> results of all previous iterations are being overwritten by the last
> > one.
>
> >>>> regards
> >>>> Steve
> >>>> --
> >>>> DjangoCon US 2010 September 7-9http://djangocon.us/
>
> >> --
> >> DjangoCon US 2010 September 7-9http://djangocon.us/
>
> --
> DjangoCon US 2010 September 7-9http://djangocon.us/

-- 
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.

Reply via email to