0

这是一个简单得令人尴尬的问题。我试图了解如何在我正在构建的第一个 Django 应用程序中合并一个简单的 Python 函数。这是我的views.py文件...

from django.shortcuts import render
from noticeboard.models import Listings
from django.views import generic
from django.template import Context

class IndexView(generic.ListView):
    template_name = 'listings/index.html'
    context_object_name = 'latest_listings'

    def get_queryset(self):
        return Listings.objects.order_by('-pub_date')

class DetailView(generic.DetailView):
    model = Listings
    template_name = 'listings/listings_detail.html'
    context_object_name = 'listing'

在列表模型中,我有以下字段:

listing = models.CharField(max_length=50)

我想编写一个函数来确保列表变量都是大写的——我知道如何编写函数——我只是不知道如何将它合并到views.py文件中!

4

3 回答 3

5

为什么不只使用upper模板过滤器

无需编写任何纯 python 以大写形式显示视图上下文变量...

于 2013-07-03T22:56:47.623 回答
2

有几种可能:

  1. upper通过html 模板中的模板过滤器传递变量,如下所示:

    {{ listing.listing|upper }}
    

    ...正如jpic所说。在这里,上下文对象是“listing”,您想要大写的属性是listing.listing。

  2. 在模型上创建一个方法,该方法以全大写形式返回该属性:

    class Listing(models.Model):
        def uppercase_listing(self):
           return self.listing.upper()
    

    然后在模板中使用它,如下所示:

    {{ listing.uppercase_listing }}
    

    请注意,您可能只有不带任何参数的方法,因为无法在 Django 模板中的隐式方法调用中传递参数。

  3. 编写自定义模板标签或过滤器。对于这个简单的用途(使变量大写),这将是矫枉过正,因为已经存在一个内置过滤器(jpic指出)。但是,如果您想要某种自定义更改,那么自定义标签或过滤器可能是合适的。请参阅https://docs.djangoproject.com/en/1.5/howto/custom-template-tags/

总而言之,您可以通过以下方式从模板中调用一个函数:

  • 将其附加到模型并以这种方式引用它
  • 编写自定义标签或模板。

但在您的情况下,您不必这样做,现有的内置过滤器已经存在,可以满足您的需求。

一般来说,django 不鼓励任何代码进入模板。它试图将其中的内容限制为相当声明性的类型语句。目标是将所有逻辑放入模型、视图和其他 python 代码中,并仅引用模板中预先计算的值。

于 2013-07-04T00:05:53.600 回答
1

没有什么能阻止您在泛型类中定义自己的自定义方法,或者在另一个文件中定义它们并将它们导入视图。例如:

class IndexView(generic.ListView):
    template_name = 'listings/index.html'
    context_object_name = 'latest_listings'

    def your_method_here(self, listing_object):
        # do your uppercase checking stuff here
        # don't forget to .save() your listing_object if you change it to uppercase!

    def get_queryset(self):
        for listing_object in Listings.objects.all()
            self.your_method_here(listing_object)
        return Listings.objects.order_by('-pub_date')

您也可以将其作为普通功能而不是方法来执行,但这完全取决于您。

当然,其他一些建议在解决实际问题(大写过滤)方面可能要好得多,但是由于您询问了在 views.py 文件中调用函数/方法,这就是答案。

于 2013-07-04T04:07:14.670 回答