Django. Как запретить пользователю ставить отзыв только один раз? - PullRequest
0 голосов
/ 26 мая 2020

Привет, ребята, я создаю сайт электронной коммерции в рамках обучения django. У меня есть модель обзора, но я хочу убедиться, что клиент может оставить отзыв только один раз. Как это сделать с моей существующей моделью и представлениями. Пожалуйста, посмотрите мои коды:

просмотры

def product_review(request, slug):
    user = request.user
    product = get_object_or_404(Product, slug=slug)
    reviews = ProductFeedback.objects.filter(product=product).order_by('-id')
    if request.POST:
        if product.user == request.user:
            messages.error(request, 'You can\'t review your own product')
            return redirect('store:product_detail', product.slug)
        else:
            p_review_form = ProductReviewForm(request.POST or None)
            if p_review_form.is_valid():
                product_rating = request.POST.get('product_rating')
                product_review = request.POST.get('product_review')
                p_review = ProductFeedback.objects.create(product=product, user=user, 
                                            product_rating=product_rating, product_review=product_review)   
                p_review.save()
                return redirect('store:product_detail', product.slug)
    else:
        p_review_form = ProductReviewForm()

    context = {
        'product':product,
        'p_review_form':p_review_form,
        'reviews': reviews,
    }
    return render(request, 'store/product/product_detail.html', context)

модель

class ProductFeedback(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product')
product_rating = models.CharField(choices=RATINGS, max_length=10, null=True)
product_review = models.TextField(max_length=1000)
reply = models.ForeignKey('ProductFeedback', null=True, related_name='replies', blank=True, on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_now_add=True)

def __str__(self):
    return f'{self.user.username}--{self.product.title} review'

1 Ответ

1 голос
/ 26 мая 2020

Вы можете отфильтровать все отзывы пользователя, если есть какие-либо отзывы, тогда возникнет ошибка. Основная идея - получить отзывы и отфильтровать их по request.user и посмотреть, есть ли они.

from django.core.exceptions import PermissionDenied

def product_review(request, slug):
  product = get_object_or_404(Product, slug=slug)
  # Get the reviews posted by the user for this product
  user_review = Product.product.filter(user=request.user)

  if request.method == 'POST':
    if user_review:
      # If there is/are any reviews, raise an error
      raise PermissionDenied('You have already given your review on this post.')

Надеюсь, это поможет.

...