Шаблон показывает пользовательскую ModelForm, но данные не сохраняются через views.py - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь создать приложение для отслеживания книг, где пользователи могут входить в систему и отправлять прочитанные книги, а также оценивать каждую книгу по 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'),)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...