2017-01-19 7 views
0

Теперь мой код, как:Могу ли я использовать метод класса в 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'), 
+4

Что такое 'self' в' class use_item (self): '? Возможно, вы захотите повторно посетить способ создания классов Python –

+0

[Представления на основе классов] (https://docs.djangoproject.com/en/1.10/topics/class-based-views/) – wim

+0

Просьба представить ваш ожидаемый результат и что вы получаете (возможно, неправильный вывод или сообщение об ошибке). –

ответ

1

Если вы хотите иметь лучшую организацию вашего кода, и повторно использовать какой-либо код на разных видах, вместо того, чтобы вставлять его там, где вам нужно, вы можете использовать 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?), Вы увидите, что это невозможно.

Одним из решений может быть перемещение общих методов в другом классе и убедитесь, что ваши представления наследуют его. Это часто называют 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 вызов общие методы. Конечно, вы можете определить новые методы, чтобы сделать их доступными только из этого представления. Вы также можете создавать члены класса для хранения значений, которые вы используете часто и т. Д. Имейте в виду, что каждый запрос, полученный Django, инициирует создание нового экземпляра вашего класса представления (вы не можете хранить данные, хранящиеся между двумя запросами в членах класса).

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 более глубокие знания.

UPDATE:

Когда вы вызываете вашу функцию useitem вам нужно использовать экземпляр вашего класса следующим образом:

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

ТипError: unbound method useitem() должен быть вызван с использованием экземпляра use_item в качестве первого аргумента (вместо этого ничего не получается) [19/Jan/2017 19:43:52] «GET/HTTP/1.1» 500 59 – ming

+0

Я думаю, что эта ошибка означает что я должен создать экземпляр класса, прежде чем я вызову метод. Но как это сделать в джанго? – ming

+0

@ming Обновлен мой ответ. Надеюсь, что уточнит ваш запрос. –

1

В Django, вид функции обычно организованы в модули, а не в классах.

держать вещи организовал, использовать более одного модуля просмотров: views.py, foo_views.py, bar_views.py, или: views/__init__.py, views/foo.py, views/bar.py.

Смежные вопросы