我可以在 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()
现在,您的视图 jelly
和 use_item
调用公共方法。当然,您可以在视图中定义新方法,使它们仅在该视图中可用。您还可以创建 class 成员来存储您经常使用的值等。请记住,Django 收到的每个请求都会触发创建视图的新实例 class(您不能保留数据在 class 个成员的 2 个请求之间)。
在 Django 中,视图 函数 通常组织在模块中而不是 类。
为了让事情井井有条,请使用多个视图模块:views.py
、foo_views.py
、bar_views.py
,或:views/__init__.py
、views/foo.py
、views/bar.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()
现在,您的视图 jelly
和 use_item
调用公共方法。当然,您可以在视图中定义新方法,使它们仅在该视图中可用。您还可以创建 class 成员来存储您经常使用的值等。请记住,Django 收到的每个请求都会触发创建视图的新实例 class(您不能保留数据在 class 个成员的 2 个请求之间)。
在 Django 中,视图 函数 通常组织在模块中而不是 类。
为了让事情井井有条,请使用多个视图模块:views.py
、foo_views.py
、bar_views.py
,或:views/__init__.py
、views/foo.py
、views/bar.py
.