#python #django #django-models #django-views #django-templates
#python #django #django-модели #django-просмотры #django-шаблоны
Вопрос:
У меня есть связь между Customer
и Products
, и customer_id
сохраняется в Product
таблице моделей, но я хочу отображать продукты на своей странице просмотра в соответствии с customer
, предположим, если клиент вошел в систему, используя свои данные, тогда он может видеть только свои продукты, но в настоящее время он может видеть все продукты. Пожалуйста, дайте мне знать, как я могу это сделать.
Вот мой models.py
файл…
class Customer(models.Model):
name=models.CharField(default=None)
user=models.OneToOneField(User, related_name='userwithCustomer', on_delete=models.CASCADE)
class Product(models.Model):
name=models.CharField(default=None)
customer=models.Foreignkey(Customer, related_name='customer_product', on_delete=models.CASCADE)
вот мой views.py
файл…
def display_data(request):
test_display = Product.objects.all()
context = {
'test_display': test_display
}
return render(request, 'page.html', context)
вот мой page.html
файл … здесь я пытаюсь отобразить продукты в соответствии с зарегистрированным клиентом..
<p>{{test_display.count}}</p>
Ответ №1:
Если вы уверены, что ваш пользователь вошел в систему (т.Е. Прошел проверку подлинности сеанса), Вы можете изменить свой набор запросов с test_display = Product.objects.all()
на test_display = Product.objects.filter(customer=request.user)
. Если вы хотите иметь ограничение входа в систему в своем представлении, вы можете использовать login_required
декоратор в своем представлении:
from django.contrib.auth.decorators import login_required
@login_required
def display_data(request):
test_display = Product.objects.filter(customer=request.user)
context = {
'test_display': test_display
}
return render(request, 'page.html', context)
Комментарии:
1. На самом деле я хочу подсчитать общее количество продуктов этого клиента в
product
таблице2. @Amit использует Product.objects.filter(customer=request.user).len()
3. Ну, это отфильтрованный набор запросов, основанный на клиенте… все это связано с вашими требованиями… например, итерация или подсчет… например
<p>{{test_display.count}}</p>
, для подсчета ваших результатов.4. он отображается
'QuerySet' object has no attribute 'len'
, если я использую этоProduct.objects.filter(customer=request.user.id).len()
5. Я упоминал об этом в последнем комментарии… вы должны использовать что-то вроде
Product.objects.filter(customer_id=request.user.id).count()
для подсчета результатов.
Ответ №2:
Проблема в том, что вы используете продукт вместо customer, который в результате будет отображать все продукты вместо тех, которые принадлежат исключительно указанному пользователю. Замените эту строку кода:
Product.objects.all()
с:
request.user.customer_product.all()
и он должен показывать только зарегистрированные элементы пользователя. Для отображения вам нужно создать цикл for, чтобы отобразить детали каждого элемента следующим образом:
<ul>
{% for test in test_display %}
<li>{{test.name}}:${{test.price}}</li>
{% endfor %}
</ul>