2013-07-03 44 views
0

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

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文件中!

+1

你说你想“确保列表变量都是大写” - 你的意思是你打算接受输入并希望在保存之前将其大写?您在此处使用的视图处理显示数据库中已存在的信息,但不处理创建或更新。 –

回答

1

有几个可能性:

  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指出)。但是如果您想要进行某种自定义更改,那么自定义标签或过滤器可能是合适的。

所以总结起来,你会通过调用一个函数从您的模板。

但在你的情况下,你不必,现有的内置过滤器已经存在,你想做什么。

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

+0

谢谢,这非常有帮助。很好的答案。 –

4

为什么不只是使用upper template filter

无需编写任何纯Python来显示大写一个视图环境变量...

+0

太棒了,我不知道Django有这个功能! –

+0

请[关闭此问题](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – jpic

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文件中的函数/方法,这就是答案。