>": "Payment.user" 必须是 "Account" 实例,python,authentication,django-views,payment-gateway"/>

首页 > 解决方案 > 无法分配“>": "Payment.user" 必须是 "Account" 实例

问题描述

视图文件

heloo 伙计们,我是学习 django 的学生,我正在制作一个具有 paytm 支付集成的 eccomerce 网站,我想将付款详细信息发送回后端,但我收到“无法分配”<SimpleLazyObject:<django.contrib.auth.models.AnonymousUser 对象位于0x7f6b5d473370>>”:“Payment.user”必须是“Account”实例”错误,同时尝试获取用户 ID 我不知道发生了什么请帮助我,我不知道为什么 request.user 不工作


from django.shortcuts import render, redirect
from .forms import OrderForm
from carts.models import CartItem
import os
from Paytm import Checksum
import datetime
from django.contrib import auth
from django.http import HttpResponse
import json
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required
from accounts.models import Account
from .models import Order, Payment
MERCHANT_KEY = 'kbzk1DSbJiV_O3p5'

@csrf_exempt
def payments(request,total=0, quantity=0,):
    current_user = request.user
    form =request.POST
    response_dict = {}
    for i in form.keys():
        response_dict[i] = form[i]
        if i == 'CHECKSUMHASH':
            checksum = form[i]

    verify = Checksum.verify_checksum(response_dict, MERCHANT_KEY, checksum)
    pay = Payment()
    if verify:
        pay.payment_id = response_dict['TXNID']
        pay.payment_method = response_dict['PAYMENTMODE']
        pay.user = current_user # this is giving me error
        pay.amount_paid = response_dict['TXNAMOUNT']
        pay.status = response_dict['STATUS']
        pay.created_at = response_dict['TXNDATE']
        pay.save()
        if response_dict['RESPCODE'] == '01':
            print('order succesfull')
        else:
            print('order was not succesfull')
    return render(request,'orders/payments.html', {'response':response_dict})






def place_order(request, total=0, quantity=0,):

    current_user = request.user

    # If the cart count is less than or equal to 0, then redirect back to shop
    cart_items = CartItem.objects.filter(user=current_user)
    cart_count = cart_items.count()
    if cart_count <= 0:
        return redirect('store')

    grand_total = 0
    tax = 0
    for cart_item in cart_items:
        total += (cart_item.product.price * cart_item.quantity)
        quantity += cart_item.quantity
    tax = (2 * total)/100
    grand_total = total + tax
    grand_total_paise = (total + tax) * 100

    if request.method == 'POST':
        form = OrderForm(request.POST)
        if form.is_valid():
            # Store all the billing information inside Order table
            data = Order()
            data.user = current_user
            data.first_name = form.cleaned_data['first_name']
            data.last_name = form.cleaned_data['last_name']
            data.phone = form.cleaned_data['phone']
            data.email = form.cleaned_data['email']
            data.address_line_1 = form.cleaned_data['address_line_1']
            data.address_line_2 = form.cleaned_data['address_line_2']
            data.state = form.cleaned_data['state']
            data.city = form.cleaned_data['city']
            data.order_note = form.cleaned_data['order_note']
            data.order_total = grand_total
            data.tax = tax
            data.ip = request.META.get('REMOTE_ADDR')
            data.save()
            # Generate order number
            yr = int(datetime.date.today().strftime('%Y'))
            dt = int(datetime.date.today().strftime('%d'))
            mt = int(datetime.date.today().strftime('%m'))
            d = datetime.date(yr,mt,dt)
            current_date = d.strftime("%Y%m%d") #20210305
            order_number = current_date + str(data.id)
            data.order_number = order_number
            data.save()
            Email= data.email

            order = Order.objects.get(user=current_user, is_ordered=False, order_number=order_number)
            param_dict = {
                'MID': 'WorldP64425807474247',
                'ORDER_ID': str(order_number),
                'TXN_AMOUNT': str(grand_total),
                'CUST_ID': data.email,
                'INDUSTRY_TYPE_ID': 'Retail',
                'WEBSITE': 'WEBSTAGING',
                'CHANNEL_ID': 'WEB',
                'CALLBACK_URL':'http://127.0.0.1:8000/orders/payments/',

            }
            param_dict['CHECKSUMHASH'] = Checksum.generate_checksum(param_dict, MERCHANT_KEY)
            return render(request, 'orders/payments.html',{'param_dict':param_dict})
    else:
        return redirect('checkout')

模型文件

这是我的模型文件



    from django.db import models
from accounts.models import Account
from store.models import Product, Variation
# Create your models here.
class Payment(models.Model):
    user = models.ForeignKey(Account, on_delete=models.CASCADE,null=True)
    payment_id = models.CharField(max_length=100)
    payment_method = models.CharField(max_length=100)
    amount_paid = models.CharField(max_length=100)
    status = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.payment_id


class Order(models.Model):
    STATUS = (
        ('New',  'New'),
        ('Accepted','Accepted'),
        ('Completed','Completed'),
        ('Cancelled','Cancelled'),
    )

    user = models.ForeignKey(Account, on_delete=models.SET_NULL, null=True)
    payment = models.ForeignKey(Payment, on_delete=models.SET_NULL, blank=True, null=True)
    order_number = models.CharField(max_length=20)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    phone = models.CharField(max_length=15)
    email = models.EmailField(max_length=50)
    address_line_1=models.CharField(max_length=50)
    address_line_2 = models.CharField(max_length=50,blank=True)
    country = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    city = models.CharField(max_length=50)
    order_note = models.CharField(max_length=100,blank=True)
    order_total = models.FloatField()
    tax = models.FloatField()
    status = models.CharField(max_length=10,choices=STATUS, default='New')
    ip = models.CharField(blank=True, max_length=20)
    is_ordered = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def full_name(self):
        return f'{self.first_name} {self.last_name}'

    def full_address(self):
        return f'{self.address_line_1} {self.address_line_2}'

    def __str__(self):
        return self.first_name


class OrderProduct(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    payment = models.ForeignKey(Payment, on_delete=models.SET_NULL, blank=True, null=True)
    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    variation = models.ForeignKey(Variation, on_delete=models.CASCADE)
    size = models.CharField(max_length=50)
    quantity = models.IntegerField()
    product_price = models.FloatField()
    ordered = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.product.product_name

标签: pythonauthenticationdjango-viewspayment-gateway

解决方案


推荐阅读