Reputation: 1728
Hey i have looked around through some simliar posts here on SO but havent found anything that has solved my problem. I have the following models,
from django.db import models
class Areas(models.Model):
name = models.CharField(max_length = 120)
order_in_sidebar_network = models.IntegerField(blank=True, null=True)
order_in_section_network = models.IntegerField(blank=True, null=True)
def __unicode__ (self):
return self.area_name
class Meta:
verbose_name_plural = "Areas"
verbose_name = "Area"
class Countries(models.Model):
name = models.CharField(max_length = 120, help_text = "The name of the country")
area = models.ForeignKey(Areas, verbose_name = 'Area')
def __unicode__ (self):
return self.name
class Meta:
verbose_name_plural = "Countries"
verbose_name = "Country"
ordering = ['name']
class Offices(models.Model):
country = models.ForeignKey(Countries, verbose_name = 'Country')
name = models.CharField(max_length = 255, help_text = "The name of this office, IE London")
main_office = models.BooleanField(default= False, help_text = "Is this office a key location?", verbose_name = "Key Location")
address_1 = models.CharField(max_length = 255, null = True, blank = True)
address_2 = models.CharField(max_length = 255, null = True, blank = True)
address_3 = models.CharField(max_length = 255, null = True, blank = True)
city = models.CharField(max_length = 255, null = True, blank = True)
postcode = models.CharField(max_length = 20)
tel = models.CharField(max_length = 30, null= True, blank = True, help_text = "Optional telephone contact number")
mobile = models.CharField(max_length = 30, null= True, blank = True, help_text = "Optional mobile contact number")
fax = models.CharField(max_length = 30, null= True, blank = True, help_text = "Optional fax contact number")
data_1 = models.CharField(max_length = 255, null = True, blank = True, help_text = "Optional additional data", verbose_name = "Additional information")
data_2 = models.CharField(max_length = 255, null = True, blank = True, help_text = "Optional additional data", verbose_name = "Additional information")
class Meta:
verbose_name_plural = "Offices"
verbose_name = "Office"
ordering = ['name']
def __unicode__(self):
return self.name
class OfficeMembers(models.Model):
name = models.CharField(max_length = 60, help_text = "Please tell us this person name")
title = models.CharField(max_length = 100, help_text = "The person's title, IE Managing Director")
email = models.EmailField(max_length = 255, null = True, blank = True, help_text = "Optional email address for this person")
email2 = models.EmailField(max_length = 255, null = True, blank = True, help_text = "Optional second email address for this person")
phone = models.CharField(max_length = 30, null = True, blank = True, help_text = "Optional contact number for this person")
mobile = models.CharField(max_length = 30, null = True, blank = True, help_text = "Optional mobile contact number for this person")
office = models.ForeignKey(Offices, null = True)
class Meta:
verbose_name_plural = "Office Memebers"
verbose_name = "Office memebr"
ordering = ['name']
def __unicode__(self):
return self.name
i have the following view set up
def index(request):
cache_key = "world_areas"
cache_time = 60
world_areas_cache = cache.get(cache_key)
#if no cache is set, grab the objects, and set the cache
logger.debug(world_areas)
if not world_areas_cache:
logger.info('No cache found grabbing objects')
world_areas = Areas.objects.select_related().all()
#cache.set(cache_key, world_areas, cache_time)
logger.debug(world_areas)
else:
logger.info("Getting from cache")
world_areas = world_areas_cache
return render_to_response('network/index.html', {'world_areas':world_areas}, context_instance=RequestContext(request))
trying to iterate over the world_areas object like so
{% for area in world_areas %}
produces a template syntax error
'RelatedManager' object is not iterable
Any one got any ideas why this is happeing? really cant seem to get round this! strangley this is working for me in shell :S am i missing something obvious???
Big thanks to anyone able to help!
Upvotes: 90
Views: 68857
Reputation: 3415
class Area(models.Model):
name = models.CharField(max_length = 120)
order_in_sidebar_network = models.IntegerField(blank=True, null=True)
order_in_section_network = models.IntegerField(blank=True, null=True)
class CountryArea(models.Model):
name = models.CharField(max_length = 120)
area = models.ForeignKey(Area, verbose_name = 'Area')
## Assuming you have an object; area
## To get the all the counties related to that area you can do;
{% for obj in area.countryarea_set.all %}
<h4> {{ obj.name }} </h4>
{% endfor %}
Upvotes: 1
Reputation: 17115
Call all()
to retrieve the elements from the manager.
{% for area in world_areas.all %}
Upvotes: 233
Reputation: 26924
I run into this issue by a reckless mistake:
for physicalserver in task.physicalservers:
physicalserver.relieve_task()
The task.physicalservers
is RelatedManager
object, in my case I should get the task's physicalservers, there should add .all()
.
for physicalserver in task.physicalservers.all():
Upvotes: 11
Reputation: 972
In general, it is better practice to use a values
or values_list
to pass data from a queryset to a template.
world_areas = Areas.objects.select_related().all().values_list('name', 'order_in_sidebar_network', ...)
Check out the Django docs for info on how to use the values
function if you haven't used it before.
Upvotes: 15