Преобразование представления на основе функций в представление на основе классов

У меня есть Django 2.1 views.py, который я хотел преобразовать в представление на основе классов, я НЕ являюсь продвинутым пользователем Django и знаю, что неправильно перевел функции. Код был предназначен для обслуживания модальной формы Ajax Bootstrap, и не просите меня посмотреть какое-то решение, уже построенное там, я перепробовал все, даже те, которые работали нормально в автономном режиме, они не совместимы / конфликтуют с моим шаблоном (Может быть, jquery или ..). Я преобразовал представление списка и пока что создал представление, но продолжаю получать эту ошибку:

UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext. "A {% csrf_token %} was used in a template, but the context "

Вот мой views.py, который я хочу преобразовать в CBV:

from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse
from django.template.loader import render_to_string
from .models import Book
from .forms import BookForm
from django.views.generic import TemplateView, ListView, DetailView, CreateView, UpdateView, DeleteView


#The Old function List view
#def book_list(request):
#    books = Book.objects.all()
#    return render(request, 'books/book_list.html', {'books': books})


#The New Class List view
class Book_list(ListView):
    template_name = 'books/book_list.html'
    model = Book

def save_book_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
            books = Book.objects.all()
            data['html_book_list'] = render_to_string('books/includes/partial_book_list.html', {
                'books': books
            })
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)


def book_create(request):
    if request.method == 'POST':
        form = BookForm(request.POST)
    else:
        form = BookForm()
    return save_book_form(request, form, 'books/includes/partial_book_create.html')



def book_update(request, pk):
    book = get_object_or_404(Book, pk=pk)
    if request.method == 'POST':
        form = BookForm(request.POST, instance=book)
    else:
        form = BookForm(instance=book)
    return save_book_form(request, form, 'books/includes/partial_book_update.html')


def book_delete(request, pk):
    book = get_object_or_404(Book, pk=pk)
    data = dict()
    if request.method == 'POST':
        book.delete()
        data['form_is_valid'] = True
        books = Book.objects.all()
        data['html_book_list'] = render_to_string('books/includes/partial_book_list.html', {
            'books': books
        })
    else:
        context = {'book': book}
        data['html_form'] = render_to_string('books/includes/partial_book_delete.html', context, request=request)
    return JsonResponse(data)

Бьюсь уже 9 дней. расспрашивал, спрашивал даже разработчика этого кода ... нет ответа .. Я очень ценю это, спасибо, ребята

🤔 А знаете ли вы, что...
Python является интерпретируемым языком программирования.


449
1

Ответ:

Вы можете попробовать это, чтобы изменить свое представление на представления на основе классов

class BookList(ListView):
    template_name = 'books/book_list.html'
    model = Book


class BookCreate(CreateView):
    template_name = "books/includes/partial_book_list.html"
    model = Book
    form_class = BookForm
    success_url = 'success' #name of url you want to redirect to


class BookUpdate(UpdateView):
    model = Book
    form_class = BookForm
    fields = ['name',] #field's you want to update
    template_name = 'books/includes/partial_book_update.html'
    success_url = 'success' #name of url you want to redirect to


class BookDelete(DeleteView):
    model = Book
    template_name = 'books/includes/partial_book_delete.html'
    success_url = 'success'