Как я могу задать логику типа: "Если пользователь заказывает какой-либо продукт, то он сможет оставить отзыв только об этом продукте"?
Моя цель - установить логику, например, пользователь сможет оставить отзыв только о том продукте, который он купил. Я попробовал нижеприведенный способ, но он не сработал. Пожалуйста, подскажите подходящее решение
models.py
class Products(models.Model):
user = models.ForeignKey(User, related_name="merchandise_product_related_name", on_delete=models.CASCADE, blank=True, null=True)
product_title = models.CharField(blank=True, null=True, max_length = 250)
def __str__(self):
return str(self.pk) + "." + str(self.product_title)
class ProductOrder(models.Model):
User = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='UserOrderRelatedName',on_delete=models.CASCADE)
CustomerName = models.CharField(max_length=250, blank=True, null=True)
Product = models.ForeignKey(Products, related_name='ProductOrderRelatedName',on_delete=models.CASCADE)
ProductTitle = models.CharField(max_length=250, blank=True, null=True)
def __str__(self):
return f'{self.pk}.{self.User}({self.Product})'
views.py:
def quick_view(request, quick_view_id):
quick_view = get_object_or_404(Products, pk=quick_view_id)
context = {
"quick_view":quick_view,
}
return render(request, 'quickVIEW_item.html', context)
urls.py:
path('quick_view/<int:quick_view_id>/', views.quick_view, name="quick_view"),
Шаблон:
{% if quick_view in request.user.UserOrderRelatedName.all %}
<form action="{% url 'feedBack' quick_view_id=quick_view.id %}" method="POST" class="needs-validation mt-3" style="font-size: 13px;" novalidate="" autocomplete="off" enctype="multipart/form-data">
{% csrf_token %}
<textarea id="email" placeholder="Share your experiencs..." rows="10" style="font-size: 13px;" type="email" class="form-control" name="feedBACK" value="" required></textarea>
<button type="submit" class="btn btn-outline-dark ms-auto" style="font-size: 13px;">
Submit
</button>
</form>
{% endif %}
Проблема в том, что User и Product связаны через ProductOrder, что затрудняет доступ (если не делает его невозможным) через обратный аксессор шаблона без цикла for. Вы должны установить переменную в представлении и передать ее в шаблон:
products_bought_by_user = Product.objects.filter(
ProductOrderRelatedName__user=request.user
)
if quick_view in products_bought_by_user:
user_has_bought_product = True
else:
user_has_bought_product = False
...
Тогда вы можете легко использовать его в своем шаблоне:
{% if user_has_bought_product %}
# your form
{% endif %}
Кроме того, использование представления означает, что вы можете проверить на стороне сервера, что кто-то может опубликовать отзыв - на данный момент это зависит только от того, видна HTML-форма или нет.
if user_has_bought_product:
# process posted review
else:
return redirect('access-denied-or-something')