Доступ к date_subscribeed из поля многие ко многим в шаблоне цикла for Django

У меня есть эти модели,

class Place(models.Model):
   name = models.CharField(max_length=200)
   user = models.ForeignKey(User, on_delete=models.CASCADE, 
   related_name='places', default=1)
   subscribers = models.ManyToManyField(AppUser, through='PlaceSubscriber')
   def __str__(self):              # __unicode__ on Python
       return self.name

class PlaceSubscriber(models.Model):
    place = models.ForeignKey(Place, on_delete=models.CASCADE)
    user = models.ForeignKey(AppUser, on_delete=models.CASCADE)
    date_subscribed = models.DateTimeField(editable=False, default=timezone.now)

    class Meta:
        unique_together = ('place', 'user')

Я хочу получить доступ к полям date_subscribeed в этом для цикла внутри моего шаблона

{% for o in place.subscribers.all %}
    <a href="#" class="list-group-item clearfix">
    <span class="pull-left">
         {{ forloop.counter }}. &emsp;
    </span>
    <span class="pull-left">
         <strong>{{ o.full_name }}</strong>
         <p>Email: <i>{{ o.email }}</i> | Date Subscribed: <i> {{ 
          o.place__placesubscriber__date_subscribed }} </i> </p>
    </span>
    <span class="pull-right">
    <span class="btn btn-xs btn-primary" 
       onclick="sendPushNotificationToUser('{{ o.ionic_id }}'); return 
       false;">Send Message</span>
    <span class="btn btn-xs btn-danger" onclick="deletePlaceUser({{ place.id 
        }}, {{ o.id }}); return false;  ">
      Unsubscribe
   </span>

   </button>
   </span>
   </a>
{% endfor %}

Я могу получить доступ к полю date_subscribeed вне этого foorloop как это:

{% for each in place.placesubscriber_set.all %}
    {{ each.date_subscribed }}
{% endfor %}

Но не понимаю, как к нему получить доступ внутри другого.

ОБНОВИТЬ

Это мой взгляд

class PlaceDetailView(DetailView):
    model = Place
    template_name = 'place/place_detail.html'

И это шаблон URL

url(r'^place/(?P<pk>\d+)$', views.PlaceDetailView.as_view(), name='detail_place'),

3 ответа

Решение

Я обычно пытаюсь сделать хороший запрос, чтобы иметь дело с простой структурой данных в моем шаблоне, избегая сложной логики.

Я бы заменил представление на простое, которое делает запрос, который вы хотите (надеюсь):

def place_detail(request):

    data = PlaceSubscriber.objects.all().values(
        'user__full_name',
        'user__email',
        'place__name',
        'date_subscribed'
    )

    return render(request,'place.html',{'data':data})

Это генерирует список словарей с ключами запроса. Вы можете отобразить эти данные сейчас:

{% for el in data %}
    {el.user__full_name}
    {el.date_subscribed}
    ...
{% endfor %}

Ну, я не уверен, что вы хотите, но вы можете изменить значения запроса, чтобы получить именно то, что вы хотите.

Надеюсь, поможет.

Я думаю, что в вашем файле views.py вы должны сделать это:

from django.shortcuts import render
from .models import Place
def placeview(request):
    place = Place()
    return render(request, 'place.html', {'place':place})

Я закончил, следуя подходу @Tico, я обновил свое представление, чтобы оно было менее логичным, чем раньше, это было мое обновление:

Обновил мой файл urls.py, прекратил использовать общий класс представления сведений

url(r'^place/(?P<place_id>\d+)$', views.place_detail, name='detail_place'),

Обновлен метод подробного представления в файле views.py, чтобы он возвращал нужные мне данные из обеих моделей:

def place_detail(request, place_id):
    place = get_object_or_404(Place, pk=place_id)
    placeSubscribers = PlaceSubscriber.objects.all().filter(place=place).values(
         'user__full_name',
         'user__email',
         'user__ionic_id',
         'place__name',
         'date_subscribed',
         'pk'
     )
     return render(request, 'place/place_detail.html', {'place': place, 'placeSubscribers': placeSubscribers}) 

И, наконец, обновил мой шаблон. Чтобы вытащить данные из placeSubscribeers, я могу получить доступ к полю date_subscribeed.

 {% for placeSubscriber in placeSubscribers %}
      <a href="#" class="list-group-item clearfix">
        <span class="pull-left">
          {{ forloop.counter }}. &emsp;
        </span>
        <span class="pull-left">
        <strong>{{ placeSubscriber.user__full_name }}</strong>
         <p>Email: <i>{{ placeSubscriber.user__email }}</i> | Date Subscribed: <i> {{ placeSubscriber.date_subscribed }} </i> </p>
        </span>
        <span class="pull-right">
          <span class="btn btn-xs btn-primary" onclick="sendPushNotificationToUser('{{ placeSubscriber.user__ionic_id }}'); return false;">Send Message</span>
         <span class="btn btn-xs btn-danger" onclick="deletePlaceUser({{ place.id }}, {{ placeSubscriber.pk }}); return false;  ">
           Unsubscribe
           </span>
          </button>
         </span>
         </a>
{% endfor %}
Другие вопросы по тегам