text: from django.shortcuts import render
  
  # Create your views here.
  
  from .models import Book, Author, BookInstance, Genre
  from django.views import generic
  
  def index(request):
      """
      Función vista para la página inicio del sitio.
      """
      # Genera contadores de algunos de los objetos principales
      num_books=Book.objects.all().count()
      num_instances=BookInstance.objects.all().count()
      # Libros disponibles (status = 'a')
      num_instances_available=BookInstance.objects.filter(status__exact='a').count()
      num_authors=Author.objects.count()  # El 'all()' esta implícito por defecto.
  
      num_genre=Genre.objects.count()
      #Libro con una palabra en particular (title = 'algo')
      word_books=Book.objects.filter(title__icontains='principito').count()
  
      # Numero de visitas a esta view, como está contado en la variable de sesión.
      num_visits = request.session.get('num_visits', 0)
      request.session['num_visits'] = num_visits + 1
  
      context = {
          'num_books':num_books,
          'num_instances':num_instances,
          'num_instances_available':num_instances_available,
          'num_authors':num_authors,
          'num_genre':num_genre,
          'word_books':word_books,
          'num_visits':num_visits,
      }
  
  
      # Renderiza la plantilla HTML index.html con los datos en la variable contexto
      return render(
          request,
          'index.html',
  #        context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors,'num_genre':num_genre,'word_books':word_books},
          context=context,
      )
  
  
  ###############################################
  
  class BookListView(generic.ListView):
      model = Book
      paginate_by = 10
  
  class AuthorListView(generic.ListView):
      model = Author
      paginate_by = 5
  
  class BookDetailView(generic.DetailView):
      model = Book
  
  class AuthorDetailView(generic.DetailView):
      model = Author
  
  ###############################################
  
  from django.contrib.auth.mixins import LoginRequiredMixin
  
  class LoanedBooksByUserListView(LoginRequiredMixin,generic.ListView):
      """
      Generic class-based view listing books on loan to current user.
      """
      model = BookInstance
      template_name ='catalog/bookinstance_list_borrowed_user.html'
      paginate_by = 10
  
      def get_queryset(self):
          return BookInstance.objects.filter(borrower=self.request.user).filter(status__exact='o').order_by('due_back')
  
  from django.contrib.auth.mixins import PermissionRequiredMixin
  
  class LoanedBooksAllListView(PermissionRequiredMixin, generic.ListView):
      model = BookInstance
      permission_required = 'catalog.can_mark_returned'
      template_name ='catalog/bookinstance_list_borrowed_all.html'
      paginate_by = 10
  
      def get_queryset(self):
          return BookInstance.objects.filter(status__exact='o').order_by('due_back')
  
  
  ########################################################################################################
  
  from django.contrib.auth.decorators import permission_required
  
  from django.shortcuts import get_object_or_404
  from django.http import HttpResponseRedirect
  from django.urls import reverse
  import datetime
  
  from .forms import RenewBookForm
  
  @permission_required('catalog.can_mark_returned')
  def renew_book_librarian(request, pk):
      """
      View function for renewing a specific BookInstance by librarian
      """
      book_inst=get_object_or_404(BookInstance, pk = pk)
  
      # If this is a POST request then process the Form data
      if request.method == 'POST':
  
          # Create a form instance and populate it with data from the request (binding):
          form = RenewBookForm(request.POST)
  
          # Check if the form is valid:
          if form.is_valid():
              # process the data in form.cleaned_data as required (here we just write it to the model due_back field)
              book_inst.due_back = form.cleaned_data['renewal_date']
              book_inst.save()
  
              # redirect to a new URL:
              return HttpResponseRedirect(reverse('all-borrowed') )
  
      # If this is a GET (or any other method) create the default form.
      else:
          proposed_renewal_date = datetime.date.today() + datetime.timedelta(weeks=3)
          form = RenewBookForm(initial={'renewal_date': proposed_renewal_date,})
  
      return render(request, 'catalog/book_renew_librarian.html', {'form': form, 'bookinst':book_inst})
  
  ###########################################################################################################
  
  from django.views.generic.edit import CreateView, UpdateView, DeleteView
  from django.urls import reverse_lazy
  from .models import Author
  
  class AuthorCreate(PermissionRequiredMixin, CreateView):
      model = Author
      fields = '__all__'
      initial={'date_of_death':'05/01/2018',}
      permission_required = 'catalog.can_mark_returned'
  
  class AuthorUpdate(UpdateView):
      model = Author
      fields = ['first_name','last_name','date_of_birth','date_of_death']
  
  class AuthorDelete(DeleteView):
      model = Author
      success_url = reverse_lazy('authors')
  
  ##################################################################################
  
  from django.views.generic.edit import CreateView, UpdateView, DeleteView
  from django.urls import reverse_lazy
  from .models import Book
  
  class BookCreate(CreateView):
      model = Book
      fields = '__all__'
  
  class BookUpdate(UpdateView):
      model = Book
      fields = ['title','author','summary','genre']
  
  class BookDelete(DeleteView):
      model = Book
      success_url = reverse_lazy('books')
  
  