2016-06-02 8 views
0

Мои models.py:Использование дополнительных полей через M2M на шаблоне

class Profile(models.Model): 
    name = models.CharField(max_length=32) 
    gender = models.CharField(max_length=1, choices=(('m', 'male'), 
     ('f', 'female')), default='m') 
    addresses = models.ManyToManyField(City, 
     related_name='user_city', through='User_City') 

class User_City(models.Model): 
    user = models.ForeignKey(Profile) 
    address = models.ForeignKey(City) 
    phone = models.CharField(max_length=32) 

    class Meta: 
     unique_together = ("user", "address") 

Мои view.py:

def user_profile(request, city): 
    a=Profile.objects.filter(addresses=city) 
    context_dict['lista'] = a 
    ###first alternative: 
    #b=User_City.objects.filter(user=request.user, address=city) 
    #context_dict['lista_address'] = b 
    ###second alternative: 
    #for c in a: 
     #b=User_City.objects.filter(user=c, address=city) 
     #c.phone=b.phone 
    #context_dict['lista_address'] = c 

Мои template.html:

{% for user in lista %} 
    {{ user.name }} 
    {{ user.gender}} 
    {{ user.phone }} 
    #{{ user.addresses.phone }} 
    #{{ user.addresses__phone }} 
{% endfor %} 

Он прочитал имя и пол, но не телефон ... Я пробовал много решений, но не avai л.

Я могу добавить lista_address context_dict, но тогда я не знаю, как использовать в шаблоне (я должен найти нужного пользователя в цикле for).

Я мог бы добавить некоторый атрибут в представление, но он не работает (атрибут не существует).

Спасибо за помощь

ответ

2

addresses является ManyToManyField, так как это {{ user.addresses.phone }} (или их любит) должны знать, какой из адресов (City экземпляров), имеется в виду то, чтобы посмотреть phone.

Просто петля непосредственно над User_City объектов, не Profiles:

# view.py 
a = city.user_city_set.all() # all through instances of city 
# a = User_City.objects.filter(address=city) 

# template.html 
{% for u_c in lista %} 
    {{ u_c.user.name }} 
    {{ u_c.user.gender}} 
    {{ u_c.phone }} 
{% endfor %} 

Еще один момент: 'user_city' очень плохо related_name! Это имя связанного менеджера используется для доступа к Profile экземплярам City:

city.user_city.all() 
# Bad: because this is a QuerySet of Profiles 
# Better: related_name = 'users'