Как я могу вызвать все функции в базовых представлениях класса - PullRequest
0 голосов
/ 25 апреля 2019

Я новичок в django и использую функции на основе представлений до сих пор. Теперь я начал базовые представления классов, но они настолько запутанные. как

class Newrecord(View):
    greeting="Hi" 
    def newPost(request):    
        deyCat = Category.objects.all() 
    def oldPost(request)
        deyold = OldCategory.objects.all() 


path('about/', Newrecord.as_view(greeting="G'day")),

Теперь, как из URL-адреса на основе классов я получу доступ к обеим функциям? Или я должен реализовать логику в классе, когда выполнять какую функцию? И как мы можем использовать их для наследования?

1 Ответ

1 голос
/ 25 апреля 2019

Вы можете получить доступ по глаголу http

class SoveView(View):

    def get(self, request):    
        return #somestuff

    def post(self, request)
        return #somestuff
path('about/' SomeView.as_view())

При посещении about/ с запросом на получение SomeView.get.Когда будет выполнен запрос с сообщением на about/ SomeView.post.

В вашем случае, я думаю, вам понадобятся два разных класса, потому что у вас есть две get конечные точки, что-то вроде:

class NewPosts(View):
    def get(self, request):
        return #somestuff

class OldPosts(View):
    def get(self, request):
        return #somestuff

path('newposts/', NewPosts.as_view()),
path('oldposts/', OldPosts.as_view()),

Если NewPosts и OldPosts имеют общее поведение, вы можете создать базовый класс или некоторую вспомогательную функцию

class PostsMixin(View):
    def get(self, request):
        if request.user.username == 'fake':
         raise Exception()
        # do something


class NewPosts(PostsMixin):
    def get(self, request):
        super().get(request)
        return #somestuff

class OldPosts(PostsMixin):
    def get(self, request):
        super().get(request)
        return #somestuff

path('newposts/', NewPosts.as_view()),
path('oldposts/', OldPosts.as_view()),

Вместо базового класса будет работать простая функциятоже

def common_stuff(request):
    if request.user.username == 'fake':
        raise Exception()
    # do something


class NewPosts(View):
    def get(self, request):
        common_stuff(request)
        return #somestuff

class OldPosts(View):
    def get(self, request):
        common_stuff(request)
        return #somestuff

path('newposts/', NewPosts.as_view()),
path('oldposts/', OldPosts.as_view()),

Другим способом может быть использование того же представления, но передача параметра этому представлению

class Posts(View):
    def get(self, request):
        type = request.GET.get('type', 'new') # get type query param, if is not present the default will be new
        if type == 'new': # /posts/?type=new
            result = Category.objects.all()
        elif type == 'old': #/posts/?type=old
            result = OldCategory.objects.all() 
        else:
            raise Http404() # just as example
        return #somestuff

path('posts/', NewPosts.as_view()),
class Posts(View):
    def get(self, request, type):
        if type == 'new': # /posts/?type=new
            result = Category.objects.all()
        elif type == 'old': #/posts/?type=old
            result = OldCategory.objects.all() 
        else:
            raise Http404() # just as example
        return #somestuff

path('posts/<str:type>/', NewPosts.as_view()),
...