我可以在 views.py 中使用 class 方法吗?

Can I use class method in views.py?

现在我的代码是这样的:

def use_item(request):
    itemname = request.get('value')
    if itemname == 'item1':
        #do something
    if itemname == 'item2':
        #do something else

我可以按照下面的方式来做吗?

views.py

class use_item():
    def use_item(self,request):
        itemname = request.get('value')
        use = getattr(self,itemname) # say itemname is 'item1'
        use()

    def item1(self,request):
        #do something

    def item2(self,request):
        #do something else

我试过第二种方法,但我似乎没有做对。 我之所以要这样做,是希望把方法分组,这样更有条理。

实际代码

#views.py
class use_item():
    def useitem(self,request):
        itemname = request.POST.get('value') 
        use = getattr(self,itemname)
        use()
    def jelly(self,request,topic_id):
        t = topic.objects.get(id=topic_id)
        t.top = True
        t.time_topped = datetime.datetime.now()
        t.save()

#urls.py
    url(r'^use/item/(?P<topic_id>\d+)/$', 'use_item.use_item', name='use_item'),

您需要在 class 的签名中提供视图。即:

from django.views import [your_View_name] 

然后在class定义中提供相同的视图;

class use_item(your_View_name):
    def useitem(self,request):
        itemname = request.POST.get('value') 
        use = getattr(self,itemname)
        use()

如果您要为同一视图定义 class,

class use_item(self):
    def useitem(self,request):
        itemname = request.POST.get('value') 
        use = getattr(self,itemname)
        use()

您可以参考Django docs on Class-Based-View了解更多in-depth知识。

更新:

当您调用函数 useitem 时,您需要使用 class 的实例,如下所示:

user_instance = views.use_item()       //Create instance of your class
user_instance.useritem()               //call your function using above instance 

如果你想更好地组织你的代码,并在不同的视图中重用一些代码,而不是将它粘贴到你需要的地方,你可以使用 Django class based views:

# views.py
from django.views import View

class use_item(View):

    def get(self, request, *args, **kwargs):
        itemname = request.POST.get('value')
        use = getattr(self,itemname)
        use()

    def item1(self,request):
        #do something

    def item2(self,request):
        #do something else

# urls.py
from package.views import use_item

urlpatterns = [
    # [...]
    url(r'^use/item/(?P<topic_id>\d+)/$', use_item.as_view(), name='use_item'),
    # [...]
]

但是,如果在某些时候你需要从另一个视图调用 item1()item2()(这是你提到另一个视图 jelly 的原因吗?),你会看到这是不可能的。

一个解决方案可能是将通用方法移动到另一个 class 并确保您的视图继承它。这在 django 世界中通常被称为 mixins

# views.py
from django.views import View

class ItemsRelatedLMixin:
    def item1(self, request):
        #do something

    def item2(self, request):
        #do something else

class use_item(ItemsRelatedLMixin, View):

    def get(self, request, *args, **kwargs):
        itemname = request.POST.get('value')
        use = getattr(self,itemname)
        use()

class jelly(ItemsRelatedLMixin, View):

    def get(self, request, topic_id):
        t = topic.objects.get(id=topic_id)
        t.top = True
        t.time_topped = datetime.datetime.now()
        t.save()

现在,您的视图 jellyuse_item 调用公共方法。当然,您可以在视图中定义新方法,使它们仅在该视图中可用。您还可以创建 class 成员来存储您经常使用的值等。请记住,Django 收到的每个请求都会触发创建视图的新实例 class(您不能保留数据在 class 个成员的 2 个请求之间)。

在 Django 中,视图 函数 通常组织在模块中而不是 类。

为了让事情井井有条,请使用多个视图模块:views.pyfoo_views.pybar_views.py,或:views/__init__.pyviews/foo.pyviews/bar.py.