Re: [django-cs] Stylování formulářů
Díky moc Vám všem za inspiraci. Po osahání jsem zvolil cestu vlastních mikrošablon, které se hodí pro náš projekt. Floppy vypadá sympaticky, ale protože dědíme od formulářů django.contrib.auth.forms (a ne přímo z django.forms), nebyl by přechod úplně hladký. John -- -- E-mailová skupina django-cs@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+unsubscr...@googlegroups.com. Další možnosti najdete na adrese https://groups.google.com/d/optout.
Re: [django-cs] Stylování formulářů
Ahoj, vzhledem k tomu, že úprava formulářových polí je častěji věc html a css kodérů, tak se nám jako nejlepší řešení osvědčil inclusion tag "formfield" s vlastní šablonou, kde si šablonáři mohou upravovat téměř vše, co potřebují. Často totiž potřebují nahrazovat formulářové prvky různými divy a spany, přidávat třídy a navazovat javascripty, takže se jim tahle volnost poměrně dost zalíbila. Tag formfield kromě povinného parametru field, bere např. textové parametry container_tag a boolean parametry no_container, no_label, hide_colon, tabindex atd. Do šablony se pak přidává kromě samotného fieldu a vstupních parametrů kontext is_checkbox is_textarea ..., readonly, disabled, errors, required, help_text, label, input_classes apod. Celé toto řešení je v konkrétních případech upravováno dle potřeby, obecnost je zachována pouze v rámci projektu. Berte to tedy, prosím, jako návrhový vzor, ne snippet "ready to use". Honza Č. -- -- E-mailová skupina django-cs@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+unsubscr...@googlegroups.com. Další možnosti najdete na adrese https://groups.google.com/d/optout.
Re: [django-cs] Stylování formulářů
Ahoj, ja som s formularmi skoncil u takehoto riesenia (vlastny snippet na rendering formulara, v tomto pripade urcene na pouzitie s bootstrap 3): https://gist.github.com/mtirsel/4d8f81dd0403ad978cf8 Nieco taketo kopirujem z projektu do projektu a ak potrebujem nieco nestandardne, skopirujem, upravim, ulozim novy snippet a includnem. Ak potrebujem nejaky extra styll (comu sa snazim vyhnut, formulare by mali byt v idealnom pripade vsade rovnake, ale z casu na cas sa inak neda), tak staci v html sablone FORM elementu pridat nejaku class (napr. mycustomform) a potom uz viem v CSS lepsie cielit: form.mycustomform input[type=text] {...} Toto riesenie mi pride celkom flexibilne, s drobnymi upravami pokryjem vacsinu potrieb. Martin On 07/07/2014 09:02 AM, Jan Walter wrote: Drazí odborníci na Django, byl bych moc rád, pokud byste mě inspirovali vhodným směrem v následující oblasti. Pro registraci (a další operace s ní související) uživatele používáme formuláře děděné od tříd z django.contrib.auth.forms. Potřebuji jim v html definovat nějaké další atributy (typicky class, placeholder, možná další) a hledám elegantní způsob, jak to udělat. Doufám, že z pochopitelných důvodů, to chci dělat v šablonách (css bych rád držel v html, nikoli v py zdrojáku). Jediný způsob, který vidím, je zapomenout na {{form.username}} a rovnou vložit podle potřeby. Což mi také nepřijde ideální, protože ztrácím vazbu na model. I kdybych přistoupil na definici v py, nevidím elegantní způdob, jak některé společné vlastnosti polí formuláře definovat na jednom místě. Můžu v každé třídě udělat něco jako username = forms.CharField( label=_("Username"), max_length=75, widget=forms.TextInput(attrs={ 'class': 'inp-text', 'placeholder': _('Password') }) ) nebo def __init__(self, *args, **kwargs): super(MyAuthenticationForm, self).__init__(*args, **kwargs) for field in self.fields.itervalues(): widget = field.widget if isinstance(widget, forms.TextInput): widget.attrs['class'] = 'inp-text' widget.attrs['placeholder'] = field.label ale to se mi nelíbí, budu mít hodně redundantního kódu. Napadlo mě vytvoření Mixin třídy nebo dekorátoru, který by uměl polím různých tříd vnutit atributy jednotně, ale nedotáhl jsem to, nejsem přesvědčen o schůdnosti takového řešení. Možná řeším něco, co je v rozporu s filosofií Djanga (chci modifikovat něco, co má fungovat standardně), hledám teď nejlepší způsob, jak nasadit hotové ostylované šablony dodané zvenku. Díky za jakýkoli hint, John -- -- E-mailová skupina django-cs@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+unsubscr...@googlegroups.com. Další možnosti najdete na adrese https://groups.google.com/d/optout.
Re: [django-cs] Stylování formulářů
TLDR: Je to peklo. Existuje několik packages, které to nějakým způsobem řeší: - django-crispy-forms (https://github.com/maraujop/django-crispy-forms) Můžeš si definovat libovolný layout, třídy, ... Problém je v tom, že se vše definuje v pythonu, přímo u definice formuláře. - django-widget-tweaks (https://github.com/kmike/django-widget-tweaks) Celkem fajn, jednoduše můžeš přidat fieldům atributy, které potřebuješ. Problém je, že je pak z toho docela hnusný a nepřehledný kód, ale dá se. - django-floppy-forms (https://github.com/brutasse/django-floppyforms) Zajímavá myšlenky, ale ještě nikdy jsem to nepoužil v praxi. Můžeš si definovat šablony pro různé widgety (defaultně je html výstup každého widgetu zapečen přímo v Django kódu) Osobně jsem se snažil ten problém vyřešit v django-forme (https://github.com/elvard/django-forme), ale zasekl jsem se a nemám teď na to moc času. Často jsem to řešil tak, že jsem si udělal společnou šablonu pro běžný input: # templates/forms/bootstrap_field.html {{ field.label }} {% if field.help_text %} {{ field.help_text }} {% endif %} {% if field.errors %} {% for error in field.errors %} {{ error }} {% endfor %} {% endif %} a tu potom includoval ve formuláři pomocí: {% include "forms/bootstrap_field.html" field=form.username %} a když jsem někdy musel změnit jeden field, tak... jsem to natvrdo vložil do šablony. Prostě peklo. Jinak mrkni na dokumentaci k formulářům, konkrétně na atributy fieldů: https://docs.djangoproject.com/en/dev/topics/forms/#looping-over-the-form-s-fields Můžeš si pak vyrenderovat input ručně a přitom "zachovat vazbu na model", např: Definici společných atributů bych řešil nejspíš upraveným widgetem... Na závěr: Existují guru, kteří použijí {{ form }} a zbytek řeší v CSS. Závidím jim jejich život :) Tom Dne Mon, 07 Jul 2014 09:02:44 +0200 Jan Walter napsal(a): > Drazí odborníci na Django, > > byl bych moc rád, pokud byste mě inspirovali vhodným směrem v > následující oblasti. Pro registraci (a další operace s ní související) > uživatele používáme formuláře děděné od tříd z > django.contrib.auth.forms. Potřebuji jim v html definovat nějaké další > atributy (typicky class, placeholder, možná další) a hledám elegantní > způsob, jak to udělat. > > Doufám, že z pochopitelných důvodů, to chci dělat v šablonách (css bych > rád držel v html, nikoli v py zdrojáku). Jediný způsob, který vidím, je > zapomenout na {{form.username}} a rovnou vložit podle potřeby. > Což mi také nepřijde ideální, protože ztrácím vazbu na model. I kdybych > přistoupil na definici v py, nevidím elegantní způdob, jak některé > společné vlastnosti polí formuláře definovat na jednom místě. Můžu v > každé třídě udělat něco jako > > username = forms.CharField( > label=_("Username"), > max_length=75, > widget=forms.TextInput(attrs={ > 'class': 'inp-text', > 'placeholder': _('Password') > }) > ) > > nebo > > def __init__(self, *args, **kwargs): > super(MyAuthenticationForm, self).__init__(*args, **kwargs) > for field in self.fields.itervalues(): > widget = field.widget > if isinstance(widget, forms.TextInput): > widget.attrs['class'] = 'inp-text' > widget.attrs['placeholder'] = field.label > > ale to se mi nelíbí, budu mít hodně redundantního kódu. > Napadlo mě vytvoření Mixin třídy nebo dekorátoru, který by uměl polím > různých tříd vnutit atributy jednotně, ale nedotáhl jsem to, nejsem > přesvědčen o schůdnosti takového řešení. > > > Možná řeším něco, co je v rozporu s filosofií Djanga (chci modifikovat > něco, co má fungovat standardně), hledám teď nejlepší způsob, jak > nasadit hotové ostylované šablony dodané zvenku. > > > Díky za jakýkoli hint, > > John > -- -- E-mailová skupina django-cs@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+unsubscr...@googlegroups.com. Další možnosti najdete na adrese https://groups.google.com/d/optout.
Re: [django-cs] Stylování formulářů
Cau! co takle flopace? tam to jde jak v py, tak v sablone docela elegantne (imo) http://django-floppyforms.readthedocs.org/en/latest/customization.html http://django-floppyforms.readthedocs.org/en/latest/templatetags.html#field s -- aknerats[::-1] On Jul 7, 2014 9:04 AM, "Jan Walter" wrote: > Drazí odborníci na Django, > > byl bych moc rád, pokud byste mě inspirovali vhodným směrem v následující > oblasti. Pro registraci (a další operace s ní související) uživatele > používáme formuláře děděné od tříd z django.contrib.auth.forms. Potřebuji > jim v html definovat nějaké další atributy (typicky class, placeholder, > možná další) a hledám elegantní způsob, jak to udělat. > > Doufám, že z pochopitelných důvodů, to chci dělat v šablonách (css bych > rád držel v html, nikoli v py zdrojáku). Jediný způsob, který vidím, je > zapomenout na {{form.username}} a rovnou vložit podle potřeby. Což > mi také nepřijde ideální, protože ztrácím vazbu na model. I kdybych > přistoupil na definici v py, nevidím elegantní způdob, jak některé společné > vlastnosti polí formuláře definovat na jednom místě. Můžu v každé třídě > udělat něco jako > > username = forms.CharField( > label=_("Username"), > max_length=75, > widget=forms.TextInput(attrs={ > 'class': 'inp-text', > 'placeholder': _('Password') > }) > ) > > nebo > > def __init__(self, *args, **kwargs): > super(MyAuthenticationForm, self).__init__(*args, **kwargs) > for field in self.fields.itervalues(): > widget = field.widget > if isinstance(widget, forms.TextInput): > widget.attrs['class'] = 'inp-text' > widget.attrs['placeholder'] = field.label > > ale to se mi nelíbí, budu mít hodně redundantního kódu. > Napadlo mě vytvoření Mixin třídy nebo dekorátoru, který by uměl polím > různých tříd vnutit atributy jednotně, ale nedotáhl jsem to, nejsem > přesvědčen o schůdnosti takového řešení. > > > Možná řeším něco, co je v rozporu s filosofií Djanga (chci modifikovat > něco, co má fungovat standardně), hledám teď nejlepší způsob, jak nasadit > hotové ostylované šablony dodané zvenku. > > > Díky za jakýkoli hint, > > John > > -- > -- > E-mailová skupina django-cs@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+unsubscr...@googlegroups.com. > Další možnosti najdete na adrese https://groups.google.com/d/optout. > -- -- E-mailová skupina django-cs@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+unsubscr...@googlegroups.com. Další možnosti najdete na adrese https://groups.google.com/d/optout.
[django-cs] Stylování formulářů
Drazí odborníci na Django, byl bych moc rád, pokud byste mě inspirovali vhodným směrem v následující oblasti. Pro registraci (a další operace s ní související) uživatele používáme formuláře děděné od tříd z django.contrib.auth.forms. Potřebuji jim v html definovat nějaké další atributy (typicky class, placeholder, možná další) a hledám elegantní způsob, jak to udělat. Doufám, že z pochopitelných důvodů, to chci dělat v šablonách (css bych rád držel v html, nikoli v py zdrojáku). Jediný způsob, který vidím, je zapomenout na {{form.username}} a rovnou vložit podle potřeby. Což mi také nepřijde ideální, protože ztrácím vazbu na model. I kdybych přistoupil na definici v py, nevidím elegantní způdob, jak některé společné vlastnosti polí formuláře definovat na jednom místě. Můžu v každé třídě udělat něco jako username = forms.CharField( label=_("Username"), max_length=75, widget=forms.TextInput(attrs={ 'class': 'inp-text', 'placeholder': _('Password') }) ) nebo def __init__(self, *args, **kwargs): super(MyAuthenticationForm, self).__init__(*args, **kwargs) for field in self.fields.itervalues(): widget = field.widget if isinstance(widget, forms.TextInput): widget.attrs['class'] = 'inp-text' widget.attrs['placeholder'] = field.label ale to se mi nelíbí, budu mít hodně redundantního kódu. Napadlo mě vytvoření Mixin třídy nebo dekorátoru, který by uměl polím různých tříd vnutit atributy jednotně, ale nedotáhl jsem to, nejsem přesvědčen o schůdnosti takového řešení. Možná řeším něco, co je v rozporu s filosofií Djanga (chci modifikovat něco, co má fungovat standardně), hledám teď nejlepší způsob, jak nasadit hotové ostylované šablony dodané zvenku. Díky za jakýkoli hint, John -- -- E-mailová skupina django-cs@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+unsubscr...@googlegroups.com. Další možnosti najdete na adrese https://groups.google.com/d/optout.