Как использовать хранимое значение request.session в DetailView в качестве исходных данных для поля ввода ModelForm?

Я новичок в Django и сейчас разрабатываю свой первый проект. Я использую DetailView для отображения информации из объекта и в этом же шаблоне есть кнопка, которая перенаправляет на шаблон ModelForm. Я уже понял, как предварительно заполнить пользовательское поле с помощью form.save(commit=False) и поле даты, просто установив значение по умолчанию для моделей. Но у меня возникают проблемы с установкой поля ForeignKey. Я уже пробовал различные методы и их вариации, но ни один не сработал. Приведенный ниже вариант - последний, который я пробовал.

Я уже изучил и попытался заставить его работать, но я не уверен, как использовать django sessions для передачи Book.id или чего-либо, что может заменить его из DetailView в поле ModelForm. Бывали случаи, когда я получал ошибку, говорящую, что определенный объект не является JSON сериализуемым, затем я пытался заставить его работать, импортируя модули сериализации, но это не сработало.

Я также сомневаюсь, что использую лучший метод для достижения желаемого с помощью класса DetailView.

Объекты: поле ввода есть с опциями для выбора. Мое намерение - установить начальное значение с объектом предыдущей страницы.

views.py

class BookView(DetailView):
    model = Book
    template_name = 'library/book.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = self.request.session['title']
        return context

    def get(self, request, *args, **kwargs):
        title= request.session.get('title', Book.title)
        request.session['title'] = title
        return super().get(request, *args, **kwargs)


def booking(request):
    form = ReservaForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            obj = form.save(commit=False)
            obj.employee= request.user
            obj.book = request.session.get('title')
            form.save()
            return redirect('home')
    return render(request, 'library/reserva.html', {'form': form})

forms.py

class BookingForm(forms.ModelForm):
        booking_date = forms.DateField(label='Booking', widget=DateInput)

    class Meta:
        model = Booking
        fields = '__all__'
        exclude = ['employee', 'creation_date']

models.py

class Book(Model):
# info
title = models.CharField('title', max_length=100)
slug = models.SlugField(max_length=150, blank=True, null=True)
author = models.ManyToManyField(Author)
isbn = models.CharField('ISBN', max_length=20, default=None, blank=True, null=True)
genre = models.ManyToManyField(Genre)
cover = models.ImageField(upload_to='covers')
release_date = models.DateField('release date')
num_pages = models.IntegerField('number of pages')
synopsis = models.TextField()

# system
creation_date = models.DateTimeField(default=timezone.now)
giver = models.ForeignKey('account.User', default=None, blank=True, null=True, on_delete=models.DO_NOTHING)
due = models.IntegerField('due', default=45)
objects = models.QuerySet()

def __str__(self):
    return self.title

class Booking(Model):
    employee= models.ForeignKey('account.User', on_delete=models.DO_NOTHING)
    creation_date= models.DateTimeField(default=timezone.now)
    book= models.ForeignKey(Book, on_delete=models.DO_NOTHING)
    booking_date= models.DateField('booking')
    objects = models.QuerySet()

urls.py

urlpatterns = [
path('home/', login_required(views.index, login_url='/login'), name='home'),
path('books/', login_required(views.books, login_url='/login'), name='books'),
path('booking/', views.booking, name='booking'),
path('books/<slug:slug>', LivroView.as_view(), name='book')]

booking.html

{% extends 'library/base.html' %}
{% block content %}
<form method="POST" action=".">
    {% csrf_token %}
    {{form.as_p}}
    <button type="submit">Book</button>
</form>
{% endblock content %}

book.html

{% extends 'library/base.html' %}
{% block content %}

<div class="row">
    <div class="col-md-1"></div>
    <div class="col-md-4" style="padding: 0px;">
        <div class="card mx-auto" style="width: 18rem; margin-bottom: 25px;">
            <a href="{% url 'book' book.slug %}">
                <img src={{book.cover.url}} class="card-img-top" alt="">
            </a>
        </div>
    </div>
    <div class="col-lg-6" style="">
        <h1>{{book}}</h1>
        {% for author in book.author.all %}
        <h4>{{ author}}</h4>
        {% endfor %}
        <br/>
        <p>{{book.synopsis}}</p>
        <br/>
        <div class="row">
            <div class="col-sm-2">
                {% for genre in book.genre.all %}
                <h6>Genre:</h6>
                <p>{{genre}}</p>
                {% endfor %}
            </div>
            <div class="col-sm-2">
                <h6>Pages:</h6>
                <p>{{book.num_pages}}</p>
            </div>
            <div class="col-sm-2">
                <h6>Year:</h6>
                <p>{{book.release_date.year}}</p>
            </div>
            <div class="col-sm-4">
                <a type="button" href="{% url 'booking' %}" class="btn btn-lg btn-outline-dark">Book</a>
            </div>
            <div class="col-sm-2"></div>
        </div>
    </div>
</div>

{% endblock content %}
Вернуться на верх