Reputation: 350
I am learning python and django and I am coding a project similar to IMDB.
I am using python 3.8.2 64 bit and django 3
I want to display the latest review a movie received regardless of the user that wrote it.
Now it shows the user's own latest review and after logging the user out the review remains without displaying the user that wrote it. I have tried to clear cache and history, didn't help. this is the model:
from django.db import models
from django.contrib.auth.models import User
class Movie(models.Model):
movie_title = models.CharField(max_length=250)
movie_poster = models.ImageField(default='default.png', blank=True)
movie_short_description = models.TextField()
director = models.CharField(max_length=250)
actor1 = models.CharField(max_length=250)
actor2 = models.CharField(max_length=250)
actor3 = models.CharField(max_length=250)
actor4 = models.CharField(max_length=250)
year = models.IntegerField()
def __str__(self):
return self.movie_title + ' - ' + str(self.year)
class Review(models.Model):
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
user = models.ForeignKey(User, default = None, on_delete=models.DO_NOTHING)
score = models.IntegerField()
review_title = models.CharField(max_length=250, default="")
movie_review = models.TextField()
date = models.DateTimeField(auto_now_add=True)
class Meta:
get_latest_by = 'date'
def __str__(self):
return self.review_title
views.py
def movie_detail(request, pk):
try:
movie = Movie.objects.get(pk=pk)
review = Review.objects.all().latest()
except Exception as e:
print(e)
return render (request, 'movies/movie_detail.html', {'movie': movie, 'review': review})
html code:
</table>
</p>
<p>User Reviews</p>
<h3>Score: {{review.score}} {{review.review_title}}</h3>
<h6>{{review.date}}, by {{ user.get_username }}</h6>
<p>{{review.movie_review}}</p>
<a href="{% url 'add_review' pk=movie.pk %}">Review this title</a>
</div>
</div>
{% endblock %}
Upvotes: 0
Views: 59
Reputation: 1317
I would create a property on Movie
that gives you all reviews and then get the latest Review
from this queryset. Here' the code:
# models.py
class Movie(models.Model):
# your other code
@property
def reviews(self) -> QuerySet:
return self.review_set.all()
# views.py
def movie_detail(request, pk):
movie = get_object_or_404(Movie, pk=pk)
latest_review = movie.reviews.latest()
# return
Ps: I would rename movie_title
, movie_poster
and movie_short_description
to just title
, poster
and short_description
. It is obvious that the title
on Movie
is the movies' title. I would also strongly suggest to change the 4 actor
s to a single model with a ManyToMany
-relation (but I think you will read on that in the documentation later).
Upvotes: 1