Как использовать хранимое значение 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 %}