如何在类基本视图中调用所有函数

问题描述 投票:-1回答:1

我是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我将访问这两个函数?或者我必须在类中实现逻辑何时执行哪个函数?我们如何使用它们进行继承?

django python-3.x django-class-based-views
1个回答
1
投票

您可以通过http动词访问

class SoveView(View):

    def get(self, request):    
        return #somestuff

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

当访问带有get请求的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()),

如果NewPostsOldPosts有一些常见的行为,你可以创建一个基类或一些辅助函数

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()),
© www.soinside.com 2019 - 2024. All rights reserved.