Bug URLField?

18 views
Skip to first unread message

MirekZv

unread,
Feb 17, 2021, 8:09:27 AM2/17/21
to django-cs
Narazil jste někdo na toto chování?
Pastnuté URL je v pořádku, ale při sledování odkazu přibyde v místě kurzoru "=" navíc (jak je vidět dole).
Debian 10 Testing KDE, Py 3.9.1, Dj 3.1.6, Chrome i Firefoxbug_urlfield.png

starenka .

unread,
Feb 17, 2021, 8:18:07 AM2/17/21
to djan...@googlegroups.com
Jen pro sichr, do zdrojaku toho html ses dival, ze to tam fakt je (tj, ze browserum nehrabe...)?
---
In Perl you shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you. | print 'aknerats'[::-1]


--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/0a4427a7-46c8-443b-a8f2-339034a178f3n%40googlegroups.com.

Vladimir Linhart

unread,
Feb 17, 2021, 8:39:14 AM2/17/21
to django-cs
navic to asi nicemu nevadi? to = navic

MirekZv

unread,
Feb 17, 2021, 10:44:20 AM2/17/21
to django-cs

starenka .

unread,
Feb 17, 2021, 10:46:31 AM2/17/21
to djan...@googlegroups.com
tak to = tam fakt nic nedela, jak rika Vladimir...

---
In Perl you shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you. | print 'aknerats'[::-1]

MirekZv

unread,
Feb 17, 2021, 10:46:56 AM2/17/21
to django-cs
PS @Ing.Vladimír: Ten odkaz tady v diskuzi jde prokliknout. Tak si to zkus a pak zkus odstranit to = za tím planovani-trasy. Trochu rozdíl, ne? A to je ještě úplná náhoda, že to není rozbité úplně.

Dne středa 17. února 2021 v 16:44:20 UTC+1 uživatel MirekZv napsal:

MirekZv

unread,
Feb 17, 2021, 10:49:11 AM2/17/21
to django-cs
No, jestli myslíš "nic nedělá" ve smyslu že "nezobrazí tu trasu", tak to máš pravdu.
Mimochodem můžete přijít na výlet, zítra Čt 9:05 ze Smíchovského nádraží 338 do Štěchovic.

Dne středa 17. února 2021 v 16:46:31 UTC+1 uživatel starenka napsal:

Radim Novotny

unread,
Feb 17, 2021, 11:32:12 AM2/17/21
to djan...@googlegroups.com
Já bych tomu rozuměl tak, že to za otazníkem jsou parametry (query string). Parametr má název a hodnotu. Hodnota je nepovinná, takže ?param1=&param2=9 je ok. Pokud je to ve formátu ?param1&param2=9 tak se to zřejmě někde  normalizuje do toho ?param1=&param2=9 a param1 sice existuje, ale nemá hodnotu. Proto ta poznámka, že = nic nedělá. 

Přijde mi, že mapy.cz to používají nějak nestandardně.

URLField s tím evidentně nedělá žádný vopičárny. Udělá něco jako urlunsplit(urlsplit(value)) aby to bylo validní. Podíval bych se co je opravdu v databázi a jestli se to nepomate někde jinde.

Radim

MirekZv

unread,
Feb 17, 2021, 4:25:50 PM2/17/21
to django-cs
@novotn

Máš pravdu, že to rovnítko se objevuje až za otazníkem a že je to teda nestandardní a dost možná to odporuje validnímu url.
To jsem si neuvědomil.
Ale i tak mi přijde dost divoké, aby si Django samo to url upravovalo.
I když asi z nevalidního na validní.
Dne středa 17. února 2021 v 17:32:12 UTC+1 uživatel novotn...@gmail.com napsal:

MirekZv

unread,
Feb 17, 2021, 4:29:52 PM2/17/21
to django-cs
@novotn

PS: Ještě bych pochopil (i když potěšilo by mě to ještě míň), že by Django neumožnilo pomocí validace toho URLFieldu tu chybnou hodnotu uložit. Ale ono ji uloží a v databázi je ta správná (i když tedy zřejmě nevalidní). Pokroutí ji až při renderování href=..

Dne středa 17. února 2021 v 17:32:12 UTC+1 uživatel novotn...@gmail.com napsal:
Já bych tomu rozuměl tak, že to za otazníkem jsou parametry (query string). Parametr má název a hodnotu. Hodnota je nepovinná, takže ?param1=&param2=9 je ok. Pokud je to ve formátu ?param1&param2=9 tak se to zřejmě někde  normalizuje do toho ?param1=&param2=9 a param1 sice existuje, ale nemá hodnotu. Proto ta poznámka, že = nic nedělá. 

Radim Novotny

unread,
Feb 18, 2021, 1:14:09 AM2/18/21
to djan...@googlegroups.com
URLField validuje (upravuje) strukturu odkazu (scheme, host, port, path, fragment, query,) ale nevaliduje obsah  jednotlivých částí, takže URL je z tohoto pohledu validní
>>> urlsplit('scheme://blah:34787654/?query#frgmnt')
SplitResult(scheme='scheme', netloc='blah:34787654', path='/', query='query', fragment='frgmnt')

Ten problém je tedy někde v renderování. Zkusil jsem si to, ale nepodařilo se mi to zopakovat. 

Jak to renderuješ? Nemůže být problém někde tam? Tohle se ve standardním Django templates vyrenderuje stejně, jak je to v DB. 

<a href="{{ obj.url }}">{{ obj.url }}</a>

Radim

MirekZv

unread,
Feb 19, 2021, 5:01:19 AM2/19/21
to django-cs
Díky, Radime.
Já se renderováním (zatím) nijak nezabývám. Je to standardní widget pro URLField ve standardním adminu.



Dne čtvrtek 18. února 2021 v 7:14:09 UTC+1 uživatel novotn...@gmail.com napsal:

Radim Novotny

unread,
Feb 19, 2021, 5:23:42 AM2/19/21
to djan...@googlegroups.com
Pravda, já hlupák jsem nezkusil Edit v Django adminu, tam bych to viděl. 

Pokazí se to až v Adminu, kde AdminURLFieldWidget upraví href takto:
context['widget']['href'] = smart_urlquote(context['widget']['value']) if value else ''

No, a to smart_urlquote s tím provede to co s tím provede. Viz 
https://github.com/django/django/blob/3.1.6/django/utils/html.py#L221

(Pdb) value

Řešením by mohlo být použít ModelAdmin.formfield_overrides a pro URLField si udělat subclass AdminURLFieldWidget, který by to href neupravoval
a nebo se zahloubat do specifikace a vymyslet, jestli je chyba v Django smart_urlquote nebo urllib.parse.urlencode nebo jestli mají mapy.cz používají URL v rozporu se standardy :)

Radim


MirekZv

unread,
Feb 19, 2021, 8:43:12 AM2/19/21
to django-cs
Super. Děkuju za perfektní rozbor. Jistě za tím bylo plno práce.

Dne pátek 19. února 2021 v 11:23:42 UTC+1 uživatel novotn...@gmail.com napsal:
Reply all
Reply to author
Forward
0 new messages