As someone whose worked on various projects in different languages over the last 15 years that heavily involved deciphering IP sent in headers to try to determine the "real" IP address of a connection, I would urge caution with anything around determining a "real IP". There is no standard in terms of where to look and what to trust. The X-FORWARDED-FOR is not always right, can easily be spoofed, it can include multiple IPs of which the order is not consistent. Sometimes the left most element is the first and "true IP", sometimes it's the right, sometimes its a value in the middle. It all depends what's included, what appended to the request, what the values are and what you want to trust/ignore. I've seen requests that include internal network IPs, then router/gateway IPs, proxy IPs and load balancers all within that head all in different orders. It's especially messy when dealing with requests on mobile network where the carrier uses proxies, sometimes 3rd parties, and where your website is hosted behind both load balancers and webserver as each may manipulate the header in different ways.
One of the best packages within the Django eco-system for trying to identify a users actual external IP that I've come across is
django-ipware. It allows you to choose the precedence order that matches your use case, yo have private IP prefixes, to configure how many proxies you wish to ignore etc. They also have a handy
notice/disclaimer on the subject.
IMO Django core should leave this 3rd party packages and individual deployments to decide and determine what they deem as being the source of the "real IP" for their individual project.