【问题标题】:How Can I call all functions in class base views如何在类基础视图中调用所有函数
【发布时间】:2019-04-25 06:49:49
【问题描述】:

我是 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】:

    你可以通过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()),
    

    如果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()),
    

    【讨论】:

    • 感谢简单而好的解释。所以如果我的函数具有差异功能并且是获取类型,那么我必须将它们放入两个差异类中吗?而这一行 super().get(request) 从基类获取信息?
    • 是的,如果方法有不同的功能,你需要两个类。另一个选项可以使用参数或查询参数和相同的方法
    • 非常感谢
    猜你喜欢
    • 2019-08-11
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多