Administrace M2M vazeb v definovaném pořadí

Vláďa Macek poslal včera na django-cs mailing list dotaz, ve kterém se zmiňuje o potřebě spravovat M2M vazby v Django administraci, avšak s podmínkou, aby bylo možné definovat pořadí jednotlivých položek.

Podobnou věc jsem nedávno řešil taky, ale trochu jinak než naznačuje Vláďa.

Moje situace

V aktuálně realizovaném projektu mám definován model popisující fotky (Photo). U spousty jiných modelů (zprávy, akce, katalog, apod) jsem potřeboval definovat M2M vztahy na fotky, přičemž jsem chtěl mít možnost ovlivnit pořadí, v jakém budou jednotlivé obrázky na stránce vykresleny

Vyřešil jsem to “jednoduše” (nic není tak jednoduché, jak by se na první pohled mohlo zdát). Definoval jsem si tzv. intermediate model, který ve vztahu M2M působí jako prostředník a přidává k vazbě další informaci (v našem případě pořadí).

V kódu takový vztah může vypadat například takto:


class Event(models.Model):
    ...
    photos = models.ManyToManyField(
        Photo, null=True, blank=True, through='PhotoEventOrder'
    )
    ...

Intermediate model (nevíte jak tomu říkat česky?) PhotoEventOrder obsahuje pouze FK na Event, FK na Photo a integer poličko “order”.

Kouzla se dějí jinde…

Doposud se nic zvláštního neděje. Dle oficiální dokumentace by teď stačilo vytvořit admin třídu pro intermediate model a připnout jej k admin modelu EventAdmin.

Ne jinak to dělám i já, ale trochu jsem si upravil šablonu pro inlajny (viz django/contrib/admin/templates/admin/edit_inline/*) a dopsal Javascriptový kód s využitím jQuery a jQuery UI. Díky tomu není třeba vztahy definovat vyplňováním několika políček, ale prostým klikáním a přetahováním:

Omlouvám za poněkud familiérní tón videa, původně jsem ho chtěl pouze poslat Vláďovi, ale takto může být užitečnější více lidem

A jak podobné situace řešíte vy?

  1. msgre posted this
Blog comments powered by Disqus