这是一个令人尴尬的简单问题。我正在尝试理解如何在我正在构建的第一个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文件中!
答案 0 :(得分:5)
为什么不使用upper
template filter?
无需编写任何纯python以大写显示视图上下文变量...
答案 1 :(得分:2)
有几种可能性:
将变量传递到html模板中的upper
模板过滤器,如下所示:
{{ listing.listing|upper }}
......正如jpic所说。这里,上下文对象是“列表”,它想要提升的属性是listing.listing。
在模型上创建一个方法,以全大写形式返回该属性:
class Listing(models.Model):
def uppercase_listing(self):
return self.listing.upper()
然后在模板中使用它,如下所示:
{{ listing.uppercase_listing }}
请注意,您可能只有不带任何参数的方法,因为无法在Django模板中的隐含方法调用中传递参数。
编写自定义模板标记或过滤器。对于这个简单的使用(使用变量大写),它将是过度的,因为已经存在一个内置的过滤器(jpic指出)。但是,如果您想要某种自定义更改,那么自定义标记或过滤器可能是合适的。请参阅https://docs.djangoproject.com/en/1.5/howto/custom-template-tags/
总而言之,您可以通过以下方式从模板中调用函数:
但是在您不必要的情况下,现有的内置过滤器已经存在,可以满足您的需求。
一般来说,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文件中调用函数/方法,那就是答案。