Django 将request.POST保存到数据库
在视图中.py:Django 将request.POST保存到数据库,django,django-models,django-forms,django-views,Django,Django Models,Django Forms,Django Views,在视图中.py: @require_POST @csrf_exempt def ipn(request): transactions_logger = logging.getLogger("django") processor = Ipn(request.POST, logger=transactions_logger) verification_success = processor.verify_ipn() encoding = request.POST.ge
@require_POST
@csrf_exempt
def ipn(request):
transactions_logger = logging.getLogger("django")
processor = Ipn(request.POST, logger=transactions_logger)
verification_success = processor.verify_ipn()
encoding = request.POST.get('ok_charset', None)
data = QueryDict(request.body, encoding=encoding)
if verification_success:
form = OkpayIpnForm(data)
if form.is_valid():
print("ALL FINE!!")
form.save()
return HttpResponse("")
class OkpayIpnForm(forms.ModelForm):
class Meta:
model = OkpayIpn
exclude = []
在表单中。py:
@require_POST
@csrf_exempt
def ipn(request):
transactions_logger = logging.getLogger("django")
processor = Ipn(request.POST, logger=transactions_logger)
verification_success = processor.verify_ipn()
encoding = request.POST.get('ok_charset', None)
data = QueryDict(request.body, encoding=encoding)
if verification_success:
form = OkpayIpnForm(data)
if form.is_valid():
print("ALL FINE!!")
form.save()
return HttpResponse("")
class OkpayIpnForm(forms.ModelForm):
class Meta:
model = OkpayIpn
exclude = []
IPN检查代码处理器=IPN(request.POST,logger=transactions\u logger:
class Ipn(object):
OKPAY_VERIFICATION_URL = 'https://checkout.okpay.com/ipn-verify'
OKPAY_IPN_INVALID = b'INVALID'
OKPAY_IPN_VERIFIED = b'VERIFIED'
OKPAY_IPN_TEST = b'TEST'
OKPAY_STATUS_COMPLETED = 'completed'
__verification_result = False
def __init__(self, request_data, logger):
if 'ok_verify' in request_data:
raise Exception("ok_verify must not be present in initial request data for {}".format(
self.__class__.__name__
))
self._request_data = request_data
self.logger = logger
return
def verify_ipn(self):
self.__verification_result = False
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
verify_request_payload = {
'ok_verify': 'true',
}
verify_request_payload.update(self._request_data)
resp = requests.post(self.OKPAY_VERIFICATION_URL, data=verify_request_payload, headers=headers)
if resp.content == self.OKPAY_IPN_VERIFIED or resp.content == self.OKPAY_IPN_TEST:
self.__verification_result = True
# if resp.content == self.OKPAY_IPN_VERIFIED: # anyway disable test on production.
# self.__verification_result = True
return self.__verification_result
一切正常,我修改IPN并验证它,然后尝试验证表单并将其保存到数据库中
但表单并没有通过验证,也并没有保存到数据库中
感谢您的帮助问题是用于保存IPN的模型的1
CharField
具有maxlength=20
,但接收到40个符号
他建议添加表单验证else
语句并打印form.errors
表单验证的错误为:
<li>ok_item_1_type<ul class="errorlist"><li>Ensure this value has at most 20 characters (it has 40).</li></ul></li>
确定项目类型- 确保此值最多有20个字符(它有40个)。
尝试在您的if form.is\u valid()
之后执行else
语句,并执行打印form.errors
。您可以看到表单未通过的原因。大thx,问题是在型号i中,CharField的maxlength=20,但收到40 SYMBOL很高兴您已修复它:)