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

时间:2017-01-19 04:39:49

标签: python django django-class-based-views

现在我的代码就像:

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'),

3 个答案:

答案 0 :(得分:1)

如果您希望更好地组织代码,并在不同视图中重复使用某些代码,而不是将其粘贴到您需要的位置,则可以使用Django class based views

item1()

但是,如果您在某个时候需要从另一个视图中调用item2()jelly(这是您提到另一个视图# 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() 的原因吗?),您会看到它是不可能的。

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

jelly

现在,您的观看次数use_item和{{1}}会调用常用方法。当然,您可以在视图中定义新方法,使其仅在该视图中可用。您还可以创建类成员来存储经常使用的值等。请记住,Django收到的每个请求都将触发创建视图类的新实例(您不能将数据存储在类成员中的2个请求之间)。

答案 1 :(得分:1)

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

为了保持整洁,请使用多个视图模块:views.pyfoo_views.pybar_views.py或:views/__init__.pyviews/foo.py,{{1 }}

答案 2 :(得分:0)

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

from django.views import [your_View_name] 

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

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

如果要为同一视图定义类,

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

您可以参考Django docs on Class-Based-View获取更深入的知识。

<强>更新

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

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