Django在POST请求中拒绝urlencoded参数?

时间:2015-10-22 10:22:06

标签: django postman

使用邮递员https://www.getpostman.com/以url编码格式发送POST请求。它们在没有包含变量时通过,否则会遇到错误,例如:

  • 表示整数参数:类型错误:int()参数必须是字符串或数字,而不是'list'

  • 表示小数参数: ValueError:从列表或元组创建Decimal时的元组大小无效。列表或元组应该只有三个元素。

对于带变量的django模型:

grams = models.IntegerField(default=0)
amount_payable = models.DecimalField(max_digits = 5, decimal_places = 2)

并关闭CRSF。可能会产生以上错误的帖子将是:

POST /mypath/ HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cache-Control: no-cache
Postman-Token: 36eac051-d7e9-b106-effa-aa1fd557a42f

amount_payable=25.22&grams=450

在Django的调试页面中,然后找到:

<django.db.models.manager.Manager object at 0x10c6d2110>  
args   ()  
name   'create'  
kwargs   {u'amount_payable': [u'25.22'], u'grams': [u'450']}

这一切都看起来很好,Django解析有问题吗?尝试过使用其他型号&amp;变量类型。 POST的格式/内容是否有问题?

查看以下代码:

def create_transaction(request):
    this_transaction = Transaction.objects.create(**request.POST)
    return HttpResponse('AOK')

1 个答案:

答案 0 :(得分:1)

request.POST不是普通字典,实际上是QueryDict对象。您需要将其转换为传统的dict,然后才能使用它:

Transaction.objects.create(**request.POST.dict())

我必须说,上面不是我要投入生产的东西 - 没有关于字典内容的检查 - 任何恶意/垃圾都可以用来创建对象。

您应该使用表单来验证输入,然后创建对象,如下所示:

class TransactionForm(forms.ModelForm):
   class Meta:
       model = Transaction

user_input = TransactionForm(request.POST())
if user_input.is_valid():
   user_input.save()