Django-установка только одной рецензии на пользователя и фильм
models.py
from django.db import models
from django.contrib.auth.models import User
class Play(models.Model):
title = models.CharField(max_length=150)
plot = models.TextField(max_length=900)
slug = models.SlugField(unique=True, null=True)
cast = models.CharField(max_length=500, default=0)
category = models.CharField(choices=CATEGORY_CHOICE, max_length=10)
image = models.ImageField(upload_to='movie')
year = models.DateTimeField()
author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
def __str__(self):
return self.title
class Review(models.Model):
user = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
movie = models.ForeignKey(Play, blank=True, null=True, on_delete=models.CASCADE)
text = models.TextField()
likes = models.ManyToManyField(User, related_name='blog_comment')
def count_likes(self):
return self.likes.count()
def __str__(self):
return f"{self.movie.title} 'User:' {self.user}"
views.py
from django.shortcuts import render, redirect, reverse
from .models import Play, Review
from django.contrib.auth.decorators import login_required
from . import forms
from django.http import HttpResponseRedirect
def movies_list(request):
article = Play.objects.all().order_by('year')
return render(request, "articles/movies_list.html", {"articles":article})
def movies_detail(request, slug):
articles = Play.objects.get(slug=slug)
all_reviews = Review.objects.all().order_by('movie')
isReviewAllowed = check_user_review(request, slug)
return render(request, "articles/movies_detail.html", {"articles":articles,'all_reviews': all_reviews, 'isReviewAllowed': isReviewAllowed})
@login_required(login_url="/accounts/login/")
def article_create(request):
if request.method == "POST":
form = forms.CreatePlay(request.POST, request.FILES)
if form.is_valid():
instance = form.save(commit=False)
instance.author = request.user
instance.save()
return redirect("movies:home")
else:
form = forms.CreatePlay()
return render(request, "articles/article_create.html", {"form":form})
@login_required(login_url="/accounts/login/")
def sub_review(request, slug):
form = forms.CreateReview(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
show = Play.objects.get(slug=slug)
instance.movie = show
instance.save()
return redirect("movies:detail", slug=slug)
else:
form = forms.CreateReview()
return render(request, "articles/review.html", {"form":form, "slug":slug})
def check_user_review(request, slug):
check = Review.objects.values_list('user', 'movie')
test = Review.objects.count()
watch = Play.objects.get(slug=slug)
if test == 0:
return True
else:
for user, movie in check:
if user == request.user.id and movie == watch.id:
return False
else:
return True
def like_view(request, slug):
like = Review.objects.get(id=request.POST.get('review_id'))
like.likes.add(request.user)
return HttpResponseRedirect(reverse('movies:detail', args=[slug]))
movies_detail.html
{% extends 'base.html' %}
{% block content %}
<img src="{{ articles.image.url }}" width="200px" height="300" style="display: inline-block;" >
<div id="movie_plot">
<h2>{{articles.title}}</h2>
<p>{{articles.plot}}</p>
{{articles.category}}
<p>{{articles.cast}}</p>
<p>{{articles.year}}</p>
</div>
{% if isReviewAllowed == True %}
<div class="isReviewAllowed">
<div class="nav_button"><a class="new_movie" href="{% url 'movies:review' slug=articles.slug %}">Create Review</a></div>
</div>
{% endif %}
{% for review in all_reviews %}
{% if review.Review == movie.title %}
<div class="all_reviews">
<div class="review">
<p><span style="font-weight: normal;">Reviewed by: </span> {{review.user}} </p>
<p><span style="font-weight: normal;">Description: </span>{{review.text}}</p>
<form style="text-align: center;" action="{% url 'movies:like' slug=articles.slug %}" method="post">
{% csrf_token %}
<button style="color: white; background: #104e89;" type="submit", name="review_id", value="{{ review.id }}", class="btn btn-primary btn-sm">Like</button> {{review.count_likes}}
</form>
</div>
{% elif review.movie.title == movie.title %}
<div class="review">
<p><span style="font-weight: normal;">Reviewed by: </span> {{review.user}} </p>
<p><span style="font-weight: normal;">Description: </span>{{review.text}}</p>
</div>
{% endif %}
{% endfor %}
</div>
{% endblock %}
hi, что я хочу сделать, это создать только одну рецензию на фильм и на пользователя, например: имя_пользователя создать рецензию для человека-паука и еще у меня проблема в том, что если я создаю рецензию на определенный фильм, она также появляется в другом фильме. Я хочу, чтобы он показывал конкретную рецензию на конкретный фильм. спасибо