Как получить продукты в соответствии с пользователем в Django?

#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>