gpt4 book ai didi

python - 在 Django DetailView 旁边显示对象列表

转载 作者:行者123 更新时间:2023-11-28 22:47:13 24 4
gpt4 key购买 nike

我有一个非常简单的 DetailView (CBV),用于显示事件的详细信息。在这个 DetailView 中,我还展示了一个侧边栏“小工具”,其中列出了 5 个接近截止日期的事件。通过查询 Event 模型,在我的 models.py 中定义了在“DetailView”中显示此“ListView”的逻辑。

有些事情告诉我这不是处理事情的正确方法。它目前正在工作......但我感觉(在阅读文档之后)这种东西应该移动到 View ,而不是模型。

有没有办法“优化”当前的逻辑?

在我的 views.py 中:

class SingleEventView(DetailView):
model = Event
template_name = 'single-event.html'

single-event.html 模板中,我通过在 models.py 中定义以下内容来显示最近发生的 5 个事件的列表:

from django.db import models
from datetime import date

class Event(models.Model):
# Model stuff

class Meta:
ordering = ['event_date']

def approaching(self):
today = date.today()
approaching_event = Event.objects.exclude(event_date__lt=today)[:5]
return approaching_event

这允许我在我的模板中执行以下操作:

<dl>
{% for approaching in event.approaching %}
<dt>{{ approaching.deadline|date:"F j" }}:</dt>
<dd>{{ approaching.title }}</dd>
{% endfor %}
</dl>

这个approaching 方法应该是静态的吗?它应该是一个函数吗?只是好像……错了。想法?

最佳答案

如果此方法在模型实例的所有使用中都有适当的用例,那么您希望在模型中使用此方法的唯一原因。

也就是说,您不是在这里写它只是为了 View

在这个特定的示例中 - 您的方法在模型中,因为您实际上是在使用模型实例作为在 View 中调用此方法的方式。

换个角度想,如果你不使用基于类的 View ,你还会把这个方法放在模型中吗?

那么,现在的问题是在使用基于类的 View 时如何将自定义对象发送到上下文中的 View ?

在所有基于类的 View (继承自 ContentMixin)中,您可以覆盖 get_context_data method在上下文中返回自定义对象:

import datetime

from yourapp.models import Event

class SingleEventView(DetailView):
model = Event
template_name = 'single-event.html'

def get_context_data(self, *args, **kwargs):
# Get the existing context dictionary, then add
# your custom object to it before returning it
ctx = super(SingleEventView, self).get_context_data(*args, **kwargs)
ctx['approaching'] = Event.objects.exclude(event_date__lt=datetime.date.today())[:5]
return ctx

当然现在在你的模板中:

<dl>
{% for approaching in approaching %}
<dt>{{ approaching.deadline|date:"F j" }}:</dt>
<dd>{{ approaching.title }}</dd>
{% endfor %}
</dl>

如果您打算在不同的 View 中使用它,最好创建一个 custom context processor这样这个对象在您的所有 View 中都可用,无论它们是如何被调用的。

import datetime

from yourapp.models import Event

def upcoming_events(request):
now = datetime.date.today()
return {'approaching': Event.objects.exclude(event_date__lt=now)[:5]}

将其保存在一个模块中,并将该模块路径添加到您的 TEMPLATE_CONTEXT_PROCESSORS setting保留默认值。

现在您不必担心“手动”发送对象列表,它将在所有继承自 RequestContext 的 View 中可用(因此所有基于类的 View 和任何基于类的 View 使用 render shortcut )。

关于python - 在 Django DetailView 旁边显示对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26570841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com