как показать продукты, загруженные только зарегистрированным пользователем? - PullRequest
2 голосов
/ 25 октября 2019

Вот моя проблема, когда пользователь входит в систему, он может видеть продукты, загруженные другим пользователем, но я пытаюсь показать, когда пользователь вошел в систему, они могут видеть только продукты, загруженные им *** **

views.py

from django.shortcuts import render, get_object_or_404, redirect
from .forms import ProductForm
from .models import Product
from django.contrib.auth.models import User

prodcut создать или загрузить

def product_create_view(request):
    form = ProductForm(request.POST or None)
    if form.is_valid():
        form.save()
        form = ProductForm()

    context = {
        'form': form
    }
    return render(request, "products/product_create.html", context)

обновление продукта

def product_update_view(request, id=id):
obj = get_object_or_404(Product, id=id)
form = ProductForm(request.POST or None, instance=obj)
if form.is_valid():
    form.save()
context = {
    'form': form
}
return render(request, "products/product_create.html", context)

попытался изменить в представлении списка, но при получении этой ошибки product_list_view () отсутствует 1 обязательный позиционный аргумент: 'user'

def product_list_view(request, user):

    queryset = Product.objects.filter(user=request.user) 

    context = {
        "object_list": queryset
        }
    return render(request, "products/product_list.html", context)

** сведения о продукте **

def product_detail_view(request, id):
    obj = get_object_or_404(Product, id=id)
    context = {
        "object": obj
    }

    return render(request, "products/product_detail.html", context)

удаление продукта

def product_delete_view(request, id):
    obj = get_object_or_404(Product, id=id)
    if request.method == "POST":
        obj.delete()
        return redirect('../../')
    context = {
        "object": obj
    }

    return render(request, "products/product_delete.html", context)

это страница шаблона списка продуктов template / product.list.html

  {% extends 'accounts/base.html' %}

  {% block content %}

      {% for instance in object_list %}
          <p>{{ instance.id }} - <a href='{{ instance.get_absolute_url }}'>{{ instance.title }}</a></p>
       {% endfor %}

    {% endblock %}

вот ** ** models.py

from django.db import models
from django.urls import reverse
from django.conf import settings 
from django.contrib.auth.models import User 

class Product(models.Model): 
    title = models.CharField(max_length=120) 
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(decimal_places=2, max_digits=10000)
    summary = models.TextField(blank=False, null=False)
    featured = models.BooleanField(default=False) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)


    def get_absolute_url(self):
        return reverse("products:product-detail", kwargs={"id": self.id}) #f"/products/{self.id}/"

urls.py

urlpatterns = [
    path('', product_list_view, name='product-list'),
    path('create/', product_create_view, name='product-create'),
    path('<int:id>/', product_detail_view, name='product-detail'),
    path('update/<int:id>/', product_update_view, name='product-update'),
    path('<int:id>/delete/', product_delete_view, name='product-delete'),
]

1 Ответ

1 голос
/ 25 октября 2019

Вы никогда не устанавливаете вошедшего в систему пользователя в Product при его создании или обновлении:

def product_create_view(request):
    if request.method == 'POST':
        form = ProductForm(request.POST)
        if form.is_valid():
            <b>form.instance.user = request.user</b>
            form.save()
    form = ProductForm()
    context = {
        'form': form
    }
    return render(request, 'products/product_create.html', context)
def product_update_view(request, id):
    obj = get_object_or_404(Product, id=id, <b>user=request.user</b>)
    if request.method == 'POST':
        form = ProductForm(request.POST, instance=obj)
        if form.is_valid():
            <b>form.instance.user = request.user</b>
            form.save()
    else:
        form = ProductForm(instance=obj)
    context = {
        'form': form
    }
    return render(request, 'products/product_create.html', context)

В ваших product_detail_view и product_delete_view вы должны фильтровать пользователяа также:

def product_detail_view(request, id):
    obj = get_object_or_404(Product, id=id<b>, user=request.user</b>)
    context = {
        'object': obj
    }
    return render(request, "products/product_detail.html", context)

def product_delete_view(request, id):
    obj = get_object_or_404(Product, id=id, <b>user=request.user</b>)
    if request.method == "POST":
        obj.delete()
        return redirect('../../')
    context = {
        'object': obj
    }
    return render(request, 'products/product_delete.html', context)

в представлении списка не следует использовать user в качестве параметра:

def product_list_view(request):
    queryset = Product.objects.filter(user=request.user)
    context = {
        'object_list': queryset
    }
    return render(request, 'products/product_list.html', context)

Дополнительные замечания :

  1. обычно в случае успешного POST-запроса, вы должны выполнить перенаправление, чтобы реализовать шаблон Post / Redirect / Get [wiki] ;
  2. вы можете сделать столбец user ненулевым , поскольку теперь он будет иметь значение NULL, если вы не укажете значение, и вы сможете создавать продукты безпользователь;
  3. , пожалуйста, не используйте request.POST <s>or None</s>. POST-запрос может быть действительным, даже если он пуст;
  4. , пожалуйста, не пишите URL-адреса самостоятельно, redirect(..) [Django-doc] может разрешитьURL основан на имени представления и значениях параметров. Это более безопасно, если позже вы захотите переписать URL-адреса;и
  5. вы можете захотеть взглянуть на классовые представления, такие как CreateView [Django-doc] , UpdateView [Джанго-док] и DeleteView [Джанго-док] . Это уменьшит количество шаблонной логики.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...