Django admin too danger for integrity

17 views
Skip to first unread message

MirekZv

unread,
Feb 17, 2021, 4:08:54 PM2/17/21
to django-cs
Podívejte se na obrázek, jsou tam dva inliny a na začátku každého z nich popup s vyplněným jménem Lenka.

Jak se ty popupy liší? jeden má "rušící křížek", druhý ho nemá.
Jak se liší návrh databáze? Jedno ForeignKey připouští null/blank=True, druhé ho nepřipouští.

To null se dá samozřejmě nastavit manipulací popupu pomocí např. myši.

Takže nepřekvapuje, že ten křížek dělá něco jiného.
Zruší osobu Lenka (s celou soustavou CASCADE deleting záznamů).

Když nad tím budeme přemýšlet, nějakou stopu logiky najdeme:
V obou případech by mohlo být legitimní osobu Lenka zrušit (i když proč takovou čistku zrovna při add/edit úplně jiného záznamu?). Ovšem ve druhém případě bychom místo té zrušené musely do ForeignKey vybrat nějakou jinou osobu (která už ani nemusí v tabulce být, Lenka může být poslední).

Ovšem i když jako programátor tyhle souvislosti nahlédneme, stejně je to trochu příliš překombinované. A jak to má pochopit ubohý uživatel?

Neboli se ptám:
Jak můžu tuhletu nebezpečnou featuru zakázat?
Dokážu to jedině Javascriptem nebo jsem přehlédnul nějaké nastavení?

Díky pokud někdo poradí ...
broken_integrity.png

MirekZv

unread,
Feb 17, 2021, 4:15:03 PM2/17/21
to django-cs
PS: ono tedy i ten Edit je příliš nebezpečný. Nějakej Lojza si to může otevřít a přepsat Lenku na Martina. Vždycky jsem si myslel, že při návrhu ovládání by měly být odlišeny (a tady by to mělo velké opodstatnění) plnokrevná editace od opravy překlepu.
No ale to bych chtěl moc.
Nicméně asi bych nejradši všude v adminu znepřístupnil tu editaci i rušení (přes ForeignKey odkazovaného) záznamu.

Dokážu to jen tím Javascriptem (což velká věda nebude) nebo to můžu někde nastavit?

Dne středa 17. února 2021 v 22:08:54 UTC+1 uživatel MirekZv napsal:

starenka .

unread,
Feb 17, 2021, 4:35:59 PM2/17/21
to djan...@googlegroups.com
Tak si tam dej raw_id a budes klidne spat :)

--
--
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/f3252964-735b-4d30-bc7c-1618d11c3471n%40googlegroups.com.

Vladimir Linhart

unread,
Feb 19, 2021, 4:38:01 AM2/19/21
to django-cs
nebo
readonly_fields

starenka .

unread,
Feb 19, 2021, 4:41:36 AM2/19/21
to djan...@googlegroups.com
Nebo si udelej vlastni form na ten inline...

starenka .

unread,
Feb 19, 2021, 4:42:20 AM2/19/21
to djan...@googlegroups.com
A nastav userum spravne prava na modely

Vladimir Linhart

unread,
Feb 19, 2021, 4:44:51 AM2/19/21
to django-cs
pripadne zakazat vsechno, Mixin pro admin classu :-)

class NonEditableMixin:
    def has_delete_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_add_permission(self, request, obj=None):
        return False

    can_delete = False

MirekZv

unread,
Feb 19, 2021, 5:08:57 AM2/19/21
to django-cs
Díky.
Klidně spím, protože si Django nenechávám přerůst přes hlavu. Je to přece jen taková hra.

Ty Vaše návrhy si cením, ale zdají se mi mimo (je možné, že jim nerozumím).
Já nepotřebuju bránit smazat osobu. Já potřebuju zabránit mazání osoby JEN během vyplňování něčeho naprosto jiného (a navíc křížkem, o kterém vůbec není jasné, že se chystá provést právě toto).
Taky nepotřebuju to řešit na úrovni každého Admin nebo každého Model. Ten problém je obecný, všude v adminu. Potřebuju 1 nastavení nebo 2 řádky kódu a zlikvidovat ten nesmysl. Takže patch v templatě formou Javascriptu bude asi nejlepší.


Dne pátek 19. února 2021 v 10:44:51 UTC+1 uživatel Ing. Vladimir napsal:

starenka .

unread,
Feb 19, 2021, 6:26:23 AM2/19/21
to djan...@googlegroups.com
¯\_(ツ)_/¯
---
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]


Pavel Cisar

unread,
Feb 19, 2021, 9:41:25 AM2/19/21
to djan...@googlegroups.com
@star...@gmail.com :D komu neni rady, tomu neni pomoci.

pá 19. 2. 2021 v 12:26 odesílatel starenka . <star...@gmail.com> napsal:

MirekZv

unread,
Feb 19, 2021, 11:55:06 AM2/19/21
to django-cs
Udělal jsem to takhle, musí to pochopitelně být v aplikaci, která je předřazená v INSTALLED_APPS před django.contrib.admin.
`templates/admin/base.html`:
```
{% extends 'admin/base.html' %}
{% block footer %}
  {{ block.super }}
  <script>
    ($ || django.jQuery)('a.delete-related, a.change-related').hide();
  </script>
{% endblock footer %}
```
Dne pátek 19. února 2021 v 15:41:25 UTC+1 uživatel cisar...@gmail.com napsal:
Reply all
Reply to author
Forward
0 new messages