使用邮差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:
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解析有问题吗?我试过使用其他型号变量类型。POST的格式/内容有问题吗?
像这样查看代码:
def create_transaction(request):
this_transaction = Transaction.objects.create(**request.POST)
return HttpResponse('AOK')
request.POST
不是一个普通的字典,它实际上是一个QueryDict
对象。您需要将其转换为传统的字典,然后才能使用它:
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()