【问题标题】:Django filter in a View视图中的 Django 过滤器
【发布时间】:2018-08-17 09:19:18
【问题描述】:

我刚开始使用 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)

我的 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')

我的 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'),
    ]

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

{% for entry in bookdate_list %}
    <li><a href="{% url 'booking:teetimes' entry.id %}">{{ entry.bookevent }}</a></li>
{% endfor %}

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

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

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

【问题讨论】:

    标签: python django django-filter


    【解决方案1】:

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

    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')

    由于pkint,因此我们过滤bookdate_id(此处为整数)。

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

    【讨论】:

    • 感谢您的快速响应。刚刚实施了您的修复程序,它实现了梦想。我会回到我的模型 defn 来做你建议的命名更改。再次感谢。
    猜你喜欢
    • 2013-11-12
    • 2018-10-05
    • 1970-01-01
    • 2018-09-02
    • 2019-03-18
    • 2023-01-15
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多