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組合而得的其餘視圖類

相關文章
相關標籤/搜索