2011-07-15 11 views
38

Hej Rozejrzałem się przez kilka prostych postów na SO, ale nie znalazłem niczego, co rozwiązało mój problem. Mam następujące modeleObiekt "RelatedManager" nie jest iterowalny Django

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 

Mam następujący widok skonfigurować

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

próbuje iteracyjne nad world_areas obiektów jak tak

{% for area in world_areas %} 

produkuje błąd składni szablonu

Obiekt "RelatedManager" nie jest iterable

Ktoś ma jakieś pomysły, dlaczego tak się dzieje? naprawdę nie mogę tego obejść! Strangley to działa dla mnie w powłoce: S: brakuje mi czegoś oczywistego ???

Wielkie dzięki dla każdego, kto może pomóc!

+0

Czy próbowałeś wyczyścić pamięć podręczną? –

+0

Próbowałem bez pamięci podręcznej! –

+1

Masz pewność, że nie czyta niczego z pamięci podręcznej? –

Odpowiedz

8

Zasadniczo lepiej jest użyć values lub values_list, aby przekazać dane z zestawu zapytań do szablonu.

world_areas = Areas.objects.select_related().all().values_list('name', 'order_in_sidebar_network', ...) 

Sprawdź Django docs do informacji na temat korzystania z funkcji values jeśli nie zostały wykorzystane wcześniej.

101

Callall(), aby pobrać elementy od menedżera.

{% for area in world_areas.all %} 
+4

to jest dobre rozwiązanie. proszę oznaczyć jako zaakceptowany. możesz tu również filtrować. –

+3

+1 i zastanawiam się, dlaczego nie jest akceptowana jako odpowiedź? – andi

+0

, ponieważ odpowiedź została udzielona 2 lata później. – user1040495