Yes, this is the expected behavior. The GET parameter is a string, being something that is just parsed out of the query parameter portion of the URL (which is, itself, a string). There is nothing to inform the code that parses the query parameters which of the things that might look like numbers should be converted to int, float, or left alone. Since converting to a numeric type and back is not a null operation ('001' -> 1 -> '1', '1.00' -> 1.0 -> '1.0'), leaving it as the string it is already is the correct choice. Knowing how a parameter is to be interpreted is an application specific task.
Probably the correct approach for you is to have view code capture the system argument and convert it to an int (perhaps there is a form field instance handy which has already done that and put it in the form's cleaned_data?), and pass that into the template context. Then compare
item.id to that, rather than something you dug out of request.GET.