Простая функция рейтинга от пользователя к пользователю в Django
Я пытаюсь добавить поле в мой Django Project, которое позволит пользователям оставлять отзыв на странице профиля другого пользователя. Я понимаю, что мне нужно два ForeignKeys в моем models.py, один для пользователя, который будет писать отзыв, а другой для профиля пользователя, на котором будет написан отзыв. Я пытался добавить Profile FK
, но я не уверен, как это сделать, и даже не знаю, что включить под Profile class
.
Это то, что я пробовал до сих пор, но я получаю ошибку, которая гласит:
ValueError at /profile/7/ Cannot assign "<User: username>": "Review.profile" должен быть экземпляром "Profile"
.
Мне также нужна помощь с моим views.py, потому что когда я играю вокруг сообщения об ошибке, я смог наконец опубликовать отзыв, но он появляется в профиле пользователя, который написал отзыв, вместо фактического профиля, в который я хотел его написать. Я новичок в кодинге и очень старался прочитать документацию django об этом, но я не могу пройти мимо этого.
models.py:
class User(AbstractUser):
name = models.CharField(max_length=200, null=True)
email = models.EmailField(unique=True, default='')
avatar = models.ImageField(null=True, default="defaultDp.jpg")
location = models.CharField(max_length=200, null=True)
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Review(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
profile = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
reviewmsg = models.TextField(null=True, blank=True)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return str(self.reviewmsg)
views.py:
def userProfile(request, pk):
user = User.objects.get(id=pk)
rooms = user.room_set.all()
reviews = user.review_set.all()
if request.method == 'POST':
review = Review.objects.create(
user=request.user,
profile=user,
reviewmsg=request.POST.get('reviewmsg')
)
return redirect('user-profile', pk=user.id)
context = {'user':user, 'rooms':rooms, 'reviews':reviews}
return render(request, 'pages/profile.html', context)
Если вы переименуете поля вашей модели, это может немного прояснить ситуацию. Здесь вы используете 'user' для обозначения как рецензента, так и рецензируемого.
Я бы рекомендовал что-то вроде следующего, чтобы сделать вещи более понятными:
class Review(models.Model):
#user = models.ForeignKey(User, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
profile = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
...
Теперь вы можете легче представить себе происходящее
def userProfile(request, pk):
user = User.objects.get(id=pk)
rooms = user.room_set.all()
#reviews = user.review_set.all()
#this is where the problem lies. the only reverse foreign key
#from user to a User field in a Review model is to author!
#so you are getting all the reviews the user is the author of!
#instead, try
reviews = Review.objects.filter(profile__user = user)
...