django views 以及restframe work views和viewsets

 

django 自带viewshtml

在django.views.generic中 分如下几个模块django

base: api

    RedirectView, TemplateView, View

dates:post

detail:url

    DetailView

edit:rest

    CreateView, DeleteView, FormView, UpdateView,

list:orm

    ListView

我的用的比较多的就是View ,其余的都是继承于Viewhtm

例子以下 能够包含get 和post继承

class LoginView(View):
    template_name = 'accounts/simple_form.html'
    def get(self, request, form=None):
        data = {}
        if not form:
            form = forms.LoginForm()
        data['form'] = form
        data['title'] = 'Login'
        data['btn_name'] = 'Login'
        return render(request, self.template_name, data)
    def post(self, request, form=None):
        data = {}
        form = forms.LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    # Redirect to a success page.
                    url = request.GET.get('next', None)
                    if not url:
                        url = reverse('main:admin_index')
                    return redirect(url)
                else:
                    # Return a 'disabled account' error message
                    return self.get(request, form)
            else:
                # Return an 'invalid login' error message.
                msg = 'Invalid login, user does not exist'
                messages.add_message(request, messages.ERROR, msg)
                return self.get(request, form)

        else:
            return self.get(request, form)

rest framework viewsget

views:

    APIView

generics:

    GenericAPIView, CreateAPIView  ........

其中APIView: 和django 的View 差很少

class PostView(views.APIView):
    def get(self, request):
        query = Post.objects.all().count()
        context = {'query':query}
        return Response(context)

GenericAPIView:  

该类有serializer 和queryset 等属性

class PostsView(GenericAPIView):

    queryset = Post.objects.all()
    serializer_class = PostSerializer
    def get(self, request):
        queryset = self.get_queryset()
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    def post(self, request):
        queryset = self.get_queryset()
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

ListAPIView: 由mixins和GenericAPIView组成

class Post3View(ListAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

 

rest framework viewsets

ViewSet: 继承APIView
GenericViewSet: 继承GenericAPIView
### 3-2-1
class GroupViewSet21(viewsets.GenericViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

    def list(self, request):
        queryset = self.get_queryset()
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

### 3-2-2
class GroupViewSet22(viewsets.GenericViewSet, mixins.ListModelMixin,):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
ReadOnlyModelViewSet ......: 由mixins和GenericViewSet拼装而得  起结构和上例3-2-2 相似

rest framework中的views 和viewsets的区别在于:

viewsets 能够自动被注册 咱们不须要关注url, 业务的进一步封装

好比 UserList和UserDetail 这种业务上相相似的 统一封装到UserViewSets中

 

rest framework 主要用于api的构建

我的用的比较多的是 GenericViewSet, GenericAPIView 已经和mixins组合而得的其余视图类

相关文章
相关标签/搜索