Django 将request.POST保存到数据库

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

视图中.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 = []
表单中。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很高兴您已修复它:)