Как исправить "AttributeError в / orders / create / 'tuple' объект не имеет атрибута 'get' в Django - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь создать сайт электронной коммерции, где пользователь отправляет заказ и перенаправляется на интерфейс оплаты (Paytm, Индия).

Однако я получаю эту ошибку:

Traceback:

File "/Users/shyambalakrishnan/Dev/trydjango/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/shyambalakrishnan/Dev/trydjango/lib/python3.7/site-packages/django/utils/deprecation.py" in __call__
  96.             response = self.process_response(request, response)

File "/Users/shyambalakrishnan/Dev/trydjango/lib/python3.7/site-packages/django/middleware/clickjacking.py" in process_response
  26.         if response.get('X-Frame-Options') is not None:

Exception Type: AttributeError at /orders/create/
Exception Value: 'tuple' object has no attribute 'get'

Если я добавляю «условие else» точно под if if.is_valid (), я получаю эту ошибку.

Traceback:

File "/Users/shyambalakrishnan/Dev/trydjango/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/shyambalakrishnan/Dev/trydjango/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  126.                 "returned None instead." % (callback.__module__, view_name)

Exception Type: ValueError at /orders/create/
Exception Value: The view orders.views.order_create didn't return an HttpResponse object. It returned None instead.

Хотя в обоих сценариях сервер работает без ошибок.

views.py (в моем приложении заказов)

from django.shortcuts import render
from .models import OrderItem , Order
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
from .forms import OrderCreateForm
from cart.cart import Cart
from payTm import Checksum
from django.http import HttpResponse
MERCHANT_KEY = 'my_merchant_key';

@csrf_exempt
def handlerequest(request):
return HttpResponse('done')
pass

@login_required
def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(
                    order=order,
                    product=item['product'],
                    price=item['price'],
                    quantity=item['quantity'],
                    total_price=item['total_price'],
                )
            cart.clear()
            param_dict = {
                'MID': 'osIFyR31215257913677',
                'ORDER_ID': str(order.id),
                'TXN_AMOUNT': str(order.total_cost),
                'CUST_ID': order.email,
                'INDUSTRY_TYPE_ID': 'Retail',
                'WEBSITE': 'WEBSTAGING',
                'CHANNEL_ID': 'WEB',
                'CALLBACK_URL': 'https://127.0.0.1:8000/handlerequest/'
            }
            param_dict['CHECKSUMHASH'] =  
            Checksum.generate_checksum_by_str(param_dict, MERCHANT_KEY)
            return (request, 'paytm.html', {'order': order}, 
                    {'param_dict': param_dict})

    else:
        form = OrderCreateForm()
        return render(request, 'create.html', {'form': form})

paytm.html

{% extends 'base.html' %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Paytm merchant Payment Page</title>
</head>
<body>
<h1> Redirecting you to the merchant.....</h1>
<h1> Please don't refresh this page.....</h1>
<form action="https://securegw-stage.paytm.in/theia/processTransaction" method="POST" name="paytm">
    {% for key,value in param_dict.items %}
    <input type="hidden" name="{{ key }}" value="{{ value }}">
    {% endfor %}
</form>
</body>
<script>
document.paytm.submit();
</script>
</html>

Я ожидаю, что вывод будет опубликован в представлении handlerequest и должен показатьмне сделано.Но, к сожалению, этого не происходит.Также в paytm.html..form action = публикуется тестовая страница paytm, которая указана в https://developer.paytm.com/docs/v1/payment-gateway

1 Ответ

0 голосов
/ 17 мая 2019

Вы забыли позвонить render. Который, кстати, занимает один контекстный словарь, а не два.

return render(request, 'paytm.html', {'order': order, 'param_dict': param_dict})
...