如何调用 class 基本视图中的所有函数
How Can I call all functions in class base views
我是 django 的新手,直到现在都使用基于函数的视图。现在我开始 class 基本视图,但它们太混乱了。喜欢
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")),
现在如何从 class 基于 url 我将访问这两个功能?或者我必须在 class 中实现逻辑,何时执行哪个功能?以及我们如何使用它们进行继承?
可以通过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
将被执行。
当带有 post 到 about/
的请求时 SomeView.post
将被执行。
在你的情况下,我认为你需要两个不同的 classes 因为你
有两个 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 或一些辅助函数
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()),
代替基础class,一个简单的函数也可以工作
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()),
我是 django 的新手,直到现在都使用基于函数的视图。现在我开始 class 基本视图,但它们太混乱了。喜欢
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")),
现在如何从 class 基于 url 我将访问这两个功能?或者我必须在 class 中实现逻辑,何时执行哪个功能?以及我们如何使用它们进行继承?
可以通过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
将被执行。
当带有 post 到 about/
的请求时 SomeView.post
将被执行。
在你的情况下,我认为你需要两个不同的 classes 因为你
有两个 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 或一些辅助函数
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()),
代替基础class,一个简单的函数也可以工作
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()),