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" <holden...@gmail.com > <mailto:holden...@gmail.com>> 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 <holden...@gmail.com > <mailto:holden...@gmail.com>> 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-9 http://djangocon.us/ > -- DjangoCon US 2010 September 7-9 http://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 django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.