[Django]类视图继承关系及实现功能

本文探讨了Django中的类视图继承结构,包括APIView、GenericAPIView和mixins。重点介绍了如何利用这些类实现增删改查功能,以及ViewSet和ModelViewSet在数据操作中的应用。
摘要由CSDN通过智能技术生成
  1. Django自带实现类
    View 自己实现对应的增加等删除操作
class StudentView(View):
    def get(self, request, pk=None):
        if pk is None:
            queryset = Student.objects.all()
            serializer = StudentSerializer(instance=queryset, many=True)
            # print()
            objs = Student.objects
            objs = list(objs.all().values())
            print(objs)
            print(type(objs))
            #return JsonResponse(serializer.data, safe=False)
            return JsonResponse(objs,safe=False)
        else:
            print(pk)
            obj = Student.objects.filter(pk=pk)
            serializer = StudentSerializer(instance=obj)
            #return JsonResponse(serializer.data, safe=False)
            return JsonResponse(list(obj.values()), safe=False)

    def post(self, request):
        try:
            data = json.loads(request.body)
        except Exception as e:
            return HttpResponse("参数有误")
        serializer = StudentSerializerModel(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, safe=False)
        else:
            data = {
   &#
当使用Django视图时,可以通过继承实现代码的复用和逻辑的扩展。以下是一个示例,展示了如何使用视图继承。 假设我们有两个视图:一个用于显示所有文章,另一个用于显示单个文章的详细信息。我们可以定义一个基础视图来包含共享的逻辑,并让其他视图继承它。 ```python from django.views import View from django.shortcuts import render from .models import Article class BaseArticleView(View): template_name = 'articles/base_article.html' def get_queryset(self): return Article.objects.all() def get_context_data(self, **kwargs): context = { 'articles': self.get_queryset() } context.update(kwargs) return context def get(self, request, *args, **kwargs): context = self.get_context_data() return render(request, self.template_name, context) class AllArticlesView(BaseArticleView): template_name = 'articles/all_articles.html' class SingleArticleView(BaseArticleView): template_name = 'articles/single_article.html' def get_queryset(self): article_id = self.kwargs.get('article_id') return Article.objects.filter(id=article_id) ``` 在上述示例中,我们定义了一个基础视图`BaseArticleView`,它包含了获取所有文章、生成上下文数据和渲染模板的通用逻辑。然后,我们创建了两个子视图`AllArticlesView`和`SingleArticleView`,它们分别继承了基础视图。 `AllArticlesView`继承了`BaseArticleView`,并覆盖了`template_name`属性,以便使用特定的模板来显示所有文章。 `SingleArticleView`也继承了`BaseArticleView`,并覆盖了`template_name`和`get_queryset()`方法,以便使用不同的模板来显示单个文章,并根据URL中的参数过滤查询集。 通过这种方式,我们可以在基础视图中处理通用的逻辑,并在子视图实现特定的需求和定制化。这样可以避免重复编写相似的代码,提高代码复用性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值