django DetailView, как показать страницу сведений

Я хочу показать детали добавленного продукта.

Я следил за этой ссылкой, и я мог создать страницу с добавлением продукта

https://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with-django.html

после добавления продукта я хочу показать детали продукта, добавленные на новой странице.

Поэтому я попробовал следующее:

class ProductDetailView(DetailView):
    model = Product
    context_object_name = 'product'
    queryset = Product.objects.filter(pk)

Я действительно не знаю, что помещать в фильтр, или использовать фильтр правильно. я попытался использовать последние и упорядочить вместо фильтра, но они не сработали.

my urls.py выглядит следующим образом:

urlpatterns = [
    path('', views.ProductDetailView.as_view(), name='product_changelist'),
    #path('', views.ProductListView.as_view(), name='product_changelist'),
    path('add/', views.ProductCreateView.as_view(), name='product_add'),
    path('<int:pk>/', views.ProductUpdateView.as_view(), name='product_change'),
    path('ajax/load-subcategory/', views.load_subcategory, name='ajax_load_subcategory'),
    #path('<int:product_id>', views.detail, name='detail'),

]

В настоящее время я получаю ошибку как

AttributeError at /product/
Generic detail view ProductDetailView must be called with either an object pk or a slug.

Я прочитал, что мы должны предоставить pk в urls.py, поэтому я попытался предоставить pk следующим образом:

path('<int:pk>', views.ProductDetailView.as_view(), name='product_changelist'),

но затем я получаю ошибку следующим образом:

NoReverseMatch at /product/add/
Reverse for 'product_changelist' with no arguments not found. 1 pattern(s) tried: ['product\\/(?P<pk>[0-9]+)$']

Любая помощь в решении этой проблемы высоко ценится. Я новичок в django, возможно, сделал много ошибок выше.

Изменить 1:

Я попробовал предложение @Radico, но по-прежнему та же ошибка: то, что я сделал, выглядит следующим образом:

Изменен мой ProductDetailView следующим образом:

class ProductDetailView(DetailView):
    model = Product
    context_object_name = 'product'

product_list.html теперь имеет следующий контент

{% extends 'base.html' %}

{% block content %}
  <br />
  <br />
  <br />
  <br />
 <br />

This is the page getting displayed121

{% url 'product_changelist' pk=object.pk %}

{% endblock %}

Тем не менее, я получаю ту же ошибку, что и

AttributeError at /product/
Generic detail view ProductDetailView must be called with either an object pk or a slug

Я ничего не изменил в urls.py.... мне тоже нужно что-то менять?

Изменить 2:

Вот мой urls.py

from django.urls import include, path
from . import views

urlpatterns = [

    path('<int:pk>', views.ProductDetailView.as_view(), name='product_changelist'),
    #path('', views.ProductDetailView.as_view(), name='product_changelist'),
    #path('', views.ProductListView.as_view(), name='product_changelist'),
    path('add/', views.ProductCreateView.as_view(), name='product_add'),
    path('', views.ProductUpdateView.as_view(), name='product_change'),
    path('ajax/load-subcategory/', views.load_subcategory, name='ajax_load_subcategory'),
    #path('<int:product_id>', views.detail, name='detail'),
]

My views.py выглядит следующим образом:

from django.shortcuts import render
from django.urls import reverse_lazy
from django.views.generic import CreateView, UpdateView, ListView, DetailView

from category.models import Subcategory
from product.forms import ProductForm
from product.models import Product

class ProductListView(ListView):
    model = Product
    context_object_name = 'product'
    queryset = Product.objects.filter()

class ProductDetailView(DetailView):
    model = Product
    context_object_name = 'product'
   # queryset = Product.objects.filter()


# class ProductDetailView(DetailView):
#     template_name = 'product/product_list.html'
#     #model = User
#         #context_object_name = 'foo'
#
#     def get_object(self):
#         #return get_object_or_404(Product, pk=request.session['product_id'])
#         return get_object_or_404(Product, pk=self.request.

class ProductCreateView(CreateView):
    model = Product
    form_class = ProductForm
    success_url = reverse_lazy('product_changelist')

def productlist(request, product_id):
    product = Product.objects.get(productid=product_id)
    return render(request, 'product/product_list.html', {'product': product})

# def productlist(request):
#     prodlist = Product.objects.order_by('-pk')[0]
#     return render(request, 'product/product_list.html', {'prodlist': prodlist})

class ProductUpdateView(UpdateView):
    model = Product
    form_class = ProductForm
    success_url = reverse_lazy('product_changelist')

def load_subcategory(request):
    category_id = request.GET.get('category')
    subcategory = Subcategory.objects.filter(category_id=category_id).order_by('name')
    return render(request, 'product/subcategory_dropdown_list_options.html', {'subcategory': subcategory})

Мой product_list.html такой, как я вставил ранее

{% extends 'base.html' %}

{% block content %}
<br />
<br />
<br />
<br /><br />

This is the page getting displayed121

{% url 'product_changelist' pk=object.pk %}

{% endblock %}
0
источник поделиться
1 ответ

Во- первых: Вам не нужно, чтобы получить запрос установить в detailview объект уже доступен, вы можете вызвать его в шаблоне object или имени класса в нижнем регистре в вашем случае product. Во-вторых: убедитесь, что вы передаете pk в URL- detailview обратитесь к detailview в шаблонах, то есть {% url 'product_change' pk=object.pk %} Я полагаю, что вы получили ошибку для второй части, проверьте URL-адрес в шаблоне product_changelist и вы можете забыть pass pk=object.pk

0
источник

Посмотрите другие вопросы по метке или Задайте вопрос