Я пытаюсь создать приложение для отслеживания книг, где пользователи могут входить в систему и отправлять прочитанные книги, а также оценивать каждую книгу по 5-звездочной шкале.
Я использую 2 формы, и они отображаются в шаблоне home. html, но я не уверен, как передать эти данные в views.py и сохранить их в базе данных. Данные HomeForm сохраняются, а данные RatingForm - нет.
forms.py:
from django import forms
from home.models import Post, Rating
class HomeForm(forms.ModelForm):
post = forms.CharField()
rating = forms.IntegerField()
class Meta:
model = Post
fields = (
'book_title',
'book_author',
'book_review',
)
class RatingForm(forms.ModelForm):
rating = forms.IntegerField()
class Meta:
model = Rating
fields = (
'stars',
)
views.py:
from django.views.generic import TemplateView
from home.forms import HomeForm, RatingForm
from django.shortcuts import render, redirect
from home.models import Post, Rating
class HomeView(TemplateView):
template_name = 'home/home.html'
def get(self, request):
form = HomeForm()
rating_form = RatingForm()
posts = Post.objects.all()
args= {'form': form, 'posts': posts, 'rating_form': rating_form,}
return render(request, self.template_name, args)
def post(self, request):
form_a = HomeForm(request.POST, prefix='home')
form_b = RatingForm(request.POST, prefix='rating')
if form_a.is_valid() and form_b.is_valid():
post = form_a.save(commit=False)
rating = form_b.save(commit=False)
text = form_a.cleaned_data['post']
post.user = request.user
post.save()
rating.user = request.user
rating.save()
rate = form_b.cleaned_data['stars']
return redirect('home')
args = {'form_a': form_a, 'form_b': form_b, 'text': text, 'rate': rate,}
return render(request, self.template_name, args)
models.py:
from django.db import models
from django.contrib.auth.models import User
from django.core.validators import MaxValueValidator, MinValueValidator
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
book_title = models.CharField(max_length=200)
book_author = models.CharField(max_length=100, null=True)
book_review = models.TextField(max_length=1000)
created = models.DateTimeField(auto_now_add=True, null=True)
updated = models.DateTimeField(auto_now=True)
def number_of_ratings(self):
ratings = Rating.objects.filter(book=self)
return len(ratings)
def avg_rating(self):
sum = 0
ratings = Rating.objects.filter(book=self)
for rating in ratings:
sum += rating.stars
if len(ratings) > 0:
return sum / len(ratings)
else:
return 0
def __str__(self):
return self.book_title
class Rating(models.Model):
book = models.ForeignKey(Post, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
stars = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)])
class Meta:
unique_together = (('user', 'book'),)
index_together = (('user', 'book'),)