使用邮递员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')
答案 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()