Reputation: 1605
I'm submitting a JSON to a django view with AJAX. The JSON looks like the following:
{
"code":"9910203040", // required
"name":"Abc", // required
"payments":[
{
"amount":300, // required
"name":"efg", // required,
"type": 2 // can be empty
},
{
"amount":100,
"name":"pqr",
"type": 3
}
]
}
The payments list can be of any size. How can I validate this in Django? Is it possible to use Django Forms to validate this? If it was Spring, I would create Request classes and use annotations on fields but can't figure out how to do this in Django.
Upvotes: 8
Views: 18909
Reputation: 1152
You can use formsets. For example:
class UserForm(Form):
code = forms.CharField()
name = forms.CharField()
class PaymentForm(Form):
amount = forms.CharField()
name = forms.CharField()
type = forms.CharField()
class TestView(View):
def post(self, request):
response_data={}
json_data=json.loads(request.body)
UserFormSet = formset_factory(UserForm)
userformset = UserFormSet(initial=[{'code' : json_data['code'], 'name' : json_data['name']}])
PaymentFormSet = formset_factory(PaymentForm)
paymentformset = PaymentFormSet(initial=json_data['payments'])
for userform in userformset:
#do something
for paymentform in paymentformset:
#do something
return JsonResponse(response_data)
Upvotes: 0
Reputation: 1084
There are a number of ways to validate json. I would list following:
Let me know if you need any help in using these
Upvotes: 3
Reputation: 3378
you can use django rest framework [1] it is very good for handling json requests.
for validating data you can use a serializer or a django form.
using a form:
@api_view(['POST'])
def my_view(request):
payments = request.data.pop('payments', [])
# validate the main object
form = MyForm(request.data)
if form.is_valid():
obj = form.save()
else:
raise APIException(form.errors)
for pdata in payments:
form = PaymentForm(pdata)
if form.is_valid():
# your code
else:
raise APIException(form.errors)
return Response()
[1] http://www.django-rest-framework.org/
Upvotes: 0
Reputation: 3860
You can use django rest framework to validate request data as mentioned by @zaphod100.10 ,
here is the serializer you can use to validate-
from rest_framework import serializers
class PaymentSerializer(serializers.Serializer):
amount = serializers.IntegerField(required=True, min_value=0, null=True)
name = serializers.CharField(required=True, max_length=128)
type = serializers.IntegerField(required=True, min_value=0)
class ValidateFormSerializer(serializers.Serializer):
code = serializers.CharField(required=True, max_length=32)
name = serializers.CharField(required=True, max_length=128)
payments = serializers.ListField(child=PaymentSerializer)
You need like this to validate it in the view section -
import ValidateFormSerializer
# add this snippet in your view section
valid_ser = ValidateFormSerializer(data=request.data)
if valid_ser.is_valid():
post_data = valid_ser.validated_data
else:
print(valid_ser.errors)
Let me know, if it is enough to solve your problem.
Upvotes: 22