Django - извлекает значения из дочерних элементов через внешний ключ, зацикливая родительские объекты в шаблоне - PullRequest
0 голосов
/ 20 марта 2020

Я довольно новичок в Django, и, вероятно, это будет полный вопрос noobi sh, но я застрял в этой ситуации, и небольшая помощь будет принята с благодарностью. У меня есть следующие модели:

class BillType(models.Model):
    name = models.CharField(max_length=200)
    created_on = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.name
class Bill(models.Model):
    bill_type = models.ForeignKey(BillType, on_delete=models.CASCADE)
    month = models.CharField(max_length=200)
    amount = models.IntegerField()
    due_date = models.CharField(max_length=200)
    note = models.TextField(blank=True)
    recurring = models.BooleanField(default=True)
    currency = models.CharField(max_length=100)
    created_on = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.month

и следующий вид:

def billingOverview(request):
    bill_types = BillType.objects.all()

    context = {
        'bill_types': bill_types,
    }

    return render(request, 'management/billing-overview.html', context)

В шаблоне я использую От l oop до l oop через объекты BillType, и эта часть работает нормально. Однако для каждого из зацикленных объектов BillType, которые отображаются отдельно в шаблоне, мне нужно получить доступ и показать данные за месяц, соответствующие этому конкретному объекту BillType. Можете ли вы помочь мне с примером, как я могу выполнить это действие?

Спасибо, Боян

В случае, если необходим шаблон:

                    {% for bill_type in bill_types %}
                    <!-- Billing overview column -->
                    <div>
                        <!-- Billing overview widget -->
                        <div class="bo-widget">
                            <div class="bo-widget-header">
                                <div>
                                    <h2>{{ bill_type.name }}</h2>
                                    <span>Overview of {{ bill_type.name|lower }} bills</span>
                                </div>
                                <a class="bo-addnew-bill" href="{% url 'newBill' bill_type.id %}">+</a>
                            </div>
                            <div class="bo-widget-content">
                                <span>OVERDUE</span>
                                <div class="bo-widget-bill-cont overdue">
                                    <span class="bo-overdue-warning"><i class="fas fa-exclamation-triangle"></i></span>
                                    <div class="bo-bill-info">
                                        <span>January 2020</span>
                                        <div>
                                            <span>2,200 MKD</span>
                                            <p>Due Date: 15 February 2020</p>
                                        </div>
                                    </div>
                                    <div class="bo-bill-actions">
                                        <a class="bo-bill-paid-action" href="javascript:;"><i class="fas fa-check"></i></a>
                                    </div>
                                </div>
                                <span>LATEST BILL</span>
                                <!-- Latest Bill -->
                                <div class="bo-widget-bill-cont">
                                    <div class="bo-bill-info">
                                        <span>{{ MONTH SHOULD GO HERE }}</span>
                                        <div>
                                            <span>2,200 MKD</span>
                                            <p>Due Date: 15 February 2020</p>
                                        </div>
                                    </div>
                                    <div class="bo-bill-actions">
                                        <a class="bo-bill-paid-action" href="javascript:;"><i class="fas fa-check"></i></a>
                                    </div>
                                </div>
                            </div>
                            <div class="bo-see-all">
                                <a href="javascript:;">See all bills</a>
                            </div>
                        </div>
                    </div>
                    {% endfor %}

1 Ответ

0 голосов
/ 21 марта 2020

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

В модели Билла я добавил related_name 'billtype' в поле ForeignKey, поэтому теперь вся строка будет выглядеть так:

bill_type = models.ForeignKey(BillType, on_delete=models.CASCADE, related_name='billtype')

Теперь для запросов в представлении я добавил следующую строку

bill_types = BillType.objects.all()

, чтобы получить все объекты типа счета в модели BillType; Затем я добавил следующую строку

bills = Bill.objects.select_related('bill_type').all()

для извлечения всех объектов в модели Билла из связанного поля 'bill_type'.

В шаблоне

{% for bt in bill_types %}
<!-- Billing overview column -->
<div>
    <!-- Billing overview widget -->
    <div class="bo-widget">
        <div class="bo-widget-header">
            <div>
                <h2>{{ bt.name }}</h2>
                <span>Overview of {{ bt.name|lower }} bills</span>
            </div>
            <a class="bo-addnew-bill" href="{% url 'newBill' bt.id %}">+</a>
        </div>
        <div class="bo-widget-content">
            <span>OVERDUE</span>
            <div class="bo-widget-bill-cont overdue">
                <span class="bo-overdue-warning"><i class="fas fa-exclamation-triangle"></i></span>
                <div class="bo-bill-info">
                    <span>January 2020</span>
                    <div>
                        <span>2,200 MKD</span>
                        <p>Due Date: 15 February 2020</p>
                    </div>
                </div>
                <div class="bo-bill-actions">
                    <a class="bo-bill-paid-action" href="javascript:;"><i class="fas fa-check"></i></a>
                </div>
            </div>
            <span>LATEST BILL</span>

            <!-- Latest Bill -->
            <div class="bo-widget-bill-cont">
                <div class="bo-bill-info">
                    <span>{{ bt.billtype.last }}</span>
                    <div>
                        <span>{{ bills.amount }} {{ bills.currency}}</span>
                        <p>{{ bills.due_date }}</p>
                    </div>
                </div>
                <div class="bo-bill-actions">
                    <a class="bo-bill-paid-action" href="javascript:;"><i class="fas fa-check"></i></a>
                </div>
            </div>


        </div>
        <div class="bo-see-all">
            <a href="javascript:;">See all bills</a>
        </div>
    </div>
</div>
{% endfor %}

Я использую For l oop до l oop через все объекты BillType и получаю нужные данные с помощью {{ bt.billtype.last }}, чтобы получить соответствующий последний объект из связанного поля модели .

...