python - 无法分配“>": "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
解决方案
推荐阅读
- angular - Angular 材质表 applyFilter 方法
- oracle - 是否可以用 Rust 编写 Oracle 外部存储过程?
- regex - 使用正则表达式获取表中的所有内容 (html)
- python - numpy广播在条件下乘以?
- firebase - Flutter Firebase 如何做动态查询
- pandas - 在特定索引上将 TB 转换为 GB
- c# - 在 WinForms 中使用触摸屏在 PDF 上涂鸦
- django - Django 测试模型实例设置
- angular - RouteReuseStrategy 多个具有不同状态的相同路由
- java - 看不到从 html 生成的 pdf 上的图像