AttributeError при успешном перенаправлении в django? - PullRequest
1 голос
/ 11 июля 2020

Перенаправление при успешном запросе POST из Host View.

def product_page_view(request, prod_slug, color=None, size=None):
    ...
    ...
    prod            = Product.objects.filter(slug=prod_slug).first()
    seller          = prod.seller
    ...
    ....
    order_form = Buy_now_form()
    if request.method == "POST":
        order_form = Buy_now_form(request.POST)

        if order_form.is_valid():
            # Function for processing POST request and return order 
            order = buy_now_view(request, prod.slug, color, size)
            # Redirection 
            return redirect(reverse('product-shipping', kwargs={'order_id':order.order_id}))
    ...

URL-адреса Host View и Target View:

    ...
    path('products/<slug:prod_slug>/<str:color>/<str:size>/', product_page_view, name="product-page-view-color-size"),
    path('products/<int:order_id>/shipping/', shipping_view, name="product-shipping"),
    ...

Хотя функция перенаправляется успешно, но с AttributeError и последующими traceback.

Traceback (most recent call last):
  File "/home/dixitgpta/byghouz/byghouz_env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/dixitgpta/byghouz/byghouz_env/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/dixitgpta/byghouz/byghouz_env/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/dixitgpta/byghouz/project/products/views.py", line 575, in product_page_view
    seller          = prod.seller

Exception Type: AttributeError at /products/54795882652377/shipping/
Exception Value: 'NoneType' object has no attribute 'seller'

Модель продукта:

class Product(models.Model):
    seller = models.ForeignKey(BygSeller, on_delete=models.CASCADE)

    id = models.IntegerField(primary_key=True)  
    slug = models.SlugField(max_length=250, null=True, blank=True)
    title = models.CharField(max_length=100)
    short_descrition = models.CharField(max_length=150, default=' ')
    date = models.DateField(auto_now_add=True)

    step1 = models.BooleanField(default=False)
    step2 = models.BooleanField(default=False)
    step3 = models.BooleanField(default=False)
    step4 = models.BooleanField(default=False)
    step5 = models.BooleanField(default=False)
    step6 = models.BooleanField(default=False)
    step7 = models.BooleanField(default=False)

    is_verified = models.BooleanField(default=False)
    is_published = models.BooleanField(default=False)

Мой целевой перенаправленный вид:

def shipping_view(request, order_id):
    customer = Customer.objects.filter(usr=request.user).first()
    order = Order.objects.filter(order_id=order_id).first()
    ...

Трассировка на TargetView после успешного перенаправления (на случай, если кто-то сочтет это полезным).

Проблема: : После перенаправления , трассировка говорит, что prod is None, однако prod принадлежит product_page_view, и я не догадывался о callback_kwargs. Значения, переданные в prod_slug в callback_kwargs (как сказано в трассировке), равны order_id, он принадлежит shipping_view. Кроме того,

Почему функция обратного вызова product_page_view? Разве это не должно быть Shipping_view?

Спасибо.

1 Ответ

1 голос
/ 11 июля 2020

На самом деле вы не должны использовать first() напрямую с методом filter(). нет записи (данных), она вернет None. поэтому у объекта None нет атрибутов продавец

вы можете использовать такой метод фильтрации

...
...
products = Product.objects.filter(slug = prod_slug)
if products.exists():  # True if any record available
     prod = products.first() 
     seller = prod.seller # please try print(seller) after that to check first record

...
...

убедитесь, что у вас есть атрибут продавец в моделях. и ваши модели содержат как минимум 1 запись . Также вы можете использовать метод count (), который возвращает количество строк, которые он содержит.

если он работает, дайте мне знать.

...