簡體   English   中英

如何訪問 Django 模板中一對多關系的屬性?

[英]How to access properties of one-to-Many relationships in Django templates?

我是 Python 和 Django 的新手。我正在構建一個個人日記,其中包含非常簡單的屬性,例如月份和條目。

模型.py

class Month(models.Model):
    id = models.AutoField(primary_key=True)
    month_name = models.CharField(verbose_name="Month", max_length=20, unique=True)
    year_number = models.IntegerField(verbose_name="Year")
    featured_img = models.ImageField(verbose_name="Featured", upload_to='diary/featured_img', default=False)

    class Meta:
        verbose_name = "Month"
        ordering = ['-year_number', 'month_name']

    def __str__(self):
        return '%s, %s' % (self.month_name, self.year_number)


class Entry(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=200)
    content = models.TextField()
    month = models.ForeignKey('Month', on_delete=models.RESTRICT, null=True)
    img = models.ImageField(verbose_name="Image", upload_to='diary/entry_img', default=False)
    date_created = models.DateTimeField(verbose_name="Date", default=timezone.now)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = "Entries"
        ordering = ['-date_created']

我正在嘗試構建一個簡單的網頁,以列表形式顯示月份,當我單擊月份時,我會在詳細視圖中看到條目。 我完成了第一步,但我無法弄清楚如何在 Django 模板中訪問 Month 和 Entry model 之間的一對多關系。 我想要做的是顯示包含所有月份 model 對象的頁面,當用戶單擊特定月份時說“十二月”,Django 返回所有將月份 object 定義為十二月的條目。

這在我插入 TabularInLine 方法的管理站點中運行良好,我可以看到特定月份的所有條目,但我不知道如何在模板和視圖中執行此操作。

管理員.py

class EntryInLine(admin.TabularInline):
    model = Entry


class MonthAdmin(admin.ModelAdmin):
    inlines = [EntryInLine]


admin.site.register(Month, MonthAdmin)


視圖.py

class MonthListView(generic.ListView):
    model = Month
    context_object_name = 'month_list'
    template_name = 'diary/month.html'


class MonthDetailView(generic.DetailView):
    model = Entry
    context_object_name = 'entries_list'
    template_name = 'diary/entries.html'


def index(request):
    month = Month.objects.all()
    entry = Entry.objects.all()

    context = {
        'month': month,
        'entry': entry,
    }

    return render(request, 'index.html', context=context)


網址.py

urlpatterns = [
    path('', views.index, name='index'),
    path('month/', views.MonthListView.as_view(), name='month'),
    path('month/<int:pk>', views.MonthDetailView.as_view(), name='entries'),
]


月.html

{% extends "base.html" %}

{% block title %}<title>Months</title>{% endblock %}

{% block content %}
<h1>Month</h1>
{% if month_list %}
    <ul>
        {% for month in month_list %}
        <li>
            <a href="month.get_absolute_url()">{{ month.month_name }}</a>
        </li>
        {% endfor %}
    </ul>
    {% else %}
    <p>There are no months to display</p>
    {% endif %}
{% endblock %}


條目.html

{% extends "base.html" %}

{% block title %}<title>Entries</title>{% endblock %}

{% block content %}
{% if entries_list %}
        {% for entry in entries_list %}
            <h3>{{ entry.title }}</h3>
            <p>{{ entry.date_created }}</p>
            <p>{{ entry.content }}</p>
        {% endfor %}
{% else %}
    <p>There are no entries in this month.</p>
{% endif %}
{% endblock %}

我知道問題可能在於在 DetailView 和 url 映射中添加條目 model,但我無法在網上找到好的資源來解釋到底出了什么問題。

class MonthDetailView(generic.DetailView):
    model = Entry
    context_object_name = 'entries_list'
    template_name = 'diary/entries.html'

    def get_context_data(self, **kwargs):
        pk = kwargs.get('pk') # this is the primary key from your URL
        context = super(MonthDetailView, self).get_context_data(**kwargs)
        context['entries_list'] = Entry.objects.filter(month=pk)
        return context

我認為這可能會有所幫助。

我知道了! 在 MonthDetailView 中添加了一個 get_context_data function,現在可以使用了!

class MonthDetailView(generic.DetailView):
    model = Entry
    context_object_name = 'entries_list'
    template_name = 'diary/entries.html'

    def get_context_data(self, **kwargs):
        context = super(MonthDetailView, self).get_context_data(**kwargs)
        context['entries_list'] = Entry.objects.filter(month=self.kwargs['pk'])
        return context

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM