视图中的 Django 过滤器

Cod*_*tle 2 python django django-filter

我刚刚开始使用 Django,目前停留在一个看似简单的需求/行为上。我想要一个基于类的 ForeignKey 用一组过滤条目呈现的页面,并从其他类的呈现视图调用。

我的 model.py 的简化版本是:

from django.db import models

class BookDay(models.Model):
    bookdate = models.DateField()
    bookevent = models.CharField(max_length=255)

class BookTime(models.Model):
    booktime = models.TimeField()
    bookdate = models.ForeignKey(BookDay, on_delete = models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

我的 view.py 写着:

from django.http import HttpResponse
from django.views import generic

from .models import BookDay, BookTime

class DayView(generic.ListView):
    template_name = 'booking/days.html'
    context_object_name = 'bookdate_list'

    def get_queryset(self):
     return BookDay.objects.order_by('bookdate')

class TimeView(generic.ListView):
    model = BookDay 
    template_name = 'booking/booktimes.html'
    context_object_name = 'booktimes_list'
    def get_queryset(self):
     return BookTime.objects.filter(bookdate=bookday_id).order_by('booktime')
Run Code Online (Sandbox Code Playgroud)

我的 urls.py 包含:

    from django.urls import path
    from . import views

    app_name = 'booking'
    urlpatterns = [
        path('', views.DayView.as_view(), name='bookdays'),
        path('<int:pk>/', views.TimeView.as_view(), name='booktimes'),
    ]
Run Code Online (Sandbox Code Playgroud)

引用的 days.html 为每个片段呈现一组链接:

{% for entry in bookdate_list %}
    <li><a href="{% url 'booking:teetimes' entry.id %}">{{ entry.bookevent }}</a></li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

单击任何生成的链接时,失败将显示为name 'bookday_id' is not defined

我可以bookday_id在上面的 views.py中放置一个固定的整数,并且它工作正常(显然仅适用于该外键)。此外,我已经广泛使用了 filter() 参数名称、相关 url 和 html,但无济于事。

我应该如何参数化它以获取单击的链接并正确过滤 BookTimes 条目?我应该为此使用 Django-filter,还是可以在 Django 中本地完成?

Wil*_*sem 6

就像错误指定的那样,没有bookday_id变量。如果我理解正确,您pk对 URL的参数感兴趣。您可以在对象的和中访问这些位置命名参数,因此您可以将其重写为:self.argsself.kwargsView

class TimeView(generic.ListView):
    model = BookDay 
    template_name = 'booking/booktimes.html'
    context_object_name = 'booktimes_list'

    def get_queryset(self):
        return BookTime.objects.filter(bookdate_id=self.kwargs['pk']).order_by('booktime')
Run Code Online (Sandbox Code Playgroud)

由于 thepk是 an int,因此我们对 the bookdate_id(这里是一个整数)进行过滤。

然而,我建议将您的bookdate外键重命名为bookday(它所指的模型的名称),因为现在它会与模型的bookdate字段产生一些混淆BookDay