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