如何在Django中编写Python代码

时间:2013-07-03 22:46:43

标签: python django

这是一个令人尴尬的简单问题。我正在尝试理解如何在我正在构建的第一个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文件中!

3 个答案:

答案 0 :(得分:5)

为什么不使用upper template filter

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

答案 1 :(得分:2)

有几种可能性:

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

    {{ listing.listing|upper }}
    

    ......正如jpic所说。这里,上下文对象是“列表”,它想要提升的属性是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/

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

    • 将其附加到模型并以此方式引用
    • 撰写自定义标记或模板。

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

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

答案 2 :(得分: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文件中调用函数/方法,那就是答案。