Как сравнить значения двух для циклов и использовать оператор if в шаблоне django? - PullRequest
0 голосов
/ 23 января 2020

Это может быть запутанный вопрос. У меня есть три таблицы в sqllite: 1) События 2) Делегаты 3) EventDelegate 1-й хранит все события, 2-й хранит все делегаты, 3-й содержит Eventid и Delegateid, чтобы показать, что конкретный делегат посещает это конкретное событие. На моей странице сведений о событии я хочу показать только делегатов, чей идентификатор присутствует в таблице event_delegate вместе с идентификатором этого события. В настоящее время я использую этот код, но не работаю

views.py

def event_det(request, eid):
    data = Event.objects.filter(id=eid) //SELECTING ONLY THE CLICKED EVENT
    data2 = Delegate.objects.all() // SELECTING ALL THE DELEGATES FROM DB
    data3 = EventDelegate.objects.filter(event_id=eid) //SELECTING RECORDS FROM EVENT_DELEGATE WHERE eventid is eid
    return render(request, 'event_details.html', {'event': data, 'delegates': data2, 'selectdelegates': data3})

template

<tbody>
   {% for del in delegates %}
   {% for sd in selectdelegates %}
   {% if del.id == sd.delegate_id %}
   <tr>
      <td>{{ del.id }}</td>
      <td>{{ del.first_name }} {{ del.last_name }}</td>
      <td>{{ del.email }}</td>
      <td>{{ del.phone }}</td>
      <td>{{ del.company }}</td>
      <td>{{ del.designation }}</td>
      <td><a href="{% url 'delegate' dataset_id=del.dataset_id %}">View</a></td>
   </tr>
   {% endif %}
   {% endfor %}
   {% endfor %}
</tbody>

Я могу поделитесь более подробной информацией, если требуется ...

Ответы [ 2 ]

1 голос
/ 23 января 2020

Если я правильно понимаю, модели EventDelegate имеют ForeignKey для события и делегата. Итак, вам нужен набор запросов объектов EventDelegate, которые связаны с рассматриваемым событием.

ed_qs = EventDelegate.objects.filter( event_id = event.id )

(возможно, добавьте .order_by( "delegate__lastname") для альфа-порядка и .select_related()

, передайте это ваш шаблон и

<tbody>
{% for ed in ed_qs %}

   <tr>
   {{ed.delegate.whatever}} ...

В качестве альтернативы вы можете использовать .annotate в наборе запросов, чтобы скопировать нужные поля связанного делегата в возвращаемые объекты. Затем вы будете ссылаться на аннотации через выбранную аннотацию. имена, такие как {{ed.delegate_firstname}}. Я предполагаю, что это будет максимально эффективно, если это имеет значение.

1 голос
/ 23 января 2020

Если у вас есть отношение между событием и делегатом события, например:

class EventDelegate(models.Model):
    event = models.ForeignKey(Event, on_delete=models.DO_NOTHING)
    delegate = models.ForignKey(Delegate, on_delete=models.DO_NOTHING)

Тогда вы можете попробовать вот так:

def event_det(request, eid):
    data = Event.objects.get(id=eid) //SELECTING ONLY THE CLICKED EVENT
    return render(request, 'event_details.html', {'event': data})

# template

{% for e in event.eventdelegate_set.all %}
     <tr>
      <td>{{ e.delegate.id }}</td>
      <td>{{ e.delegate.first_name }} {{ e.delegate.last_name }}</td>
      <td>{{ e.delegate.email }}</td>
      <td>{{ e.delegate.phone }}</td>
      <td>{{ e.delegate.company }}</td>
      <td>{{ e.delegate.designation }}</td>
      <td><a href="{% url 'delegate' dataset_id=e.delegate.dataset_id %}">View</a></td>
   </tr>
{% endfor %}

Альтернативное решение:

#view
def event_det(request, eid):
    data = EventDelegate.objects.filter(id=eid) //SELECTING ONLY THE CLICKED EVENT
    return render(request, 'event_details.html', {'event_delegates': data})

# template

{% for e in event_delegates %}
  // rest of the code as above example

Более подробную информацию можно найти в documentation.

...