Sto trasmettendo i campi di un modulo in un modello come questo {{ form.first_name }}
e vorrei aggiungere una classe (ad esempio blueprint's span-x -class) ad esso. Quindi mi piacerebbe sapere se c'è una bella soluzione readymade (filtro template) per questo, che potrei usare nella moda {{ form.first_name|add_class:"span-4" }}
? (Voglio solo sapere se gli sviluppatori di Django o qualcuno lo hanno già pensato senza saperlo prima di farlo da solo)Django: aggiunta di classi CSS durante il rendering di campi modulo in un modello
risposta
Per risolvere questo ho creato il mio filtro modello, è possibile applicarlo su qualsiasi tag, non solo elementi di input!
class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])')
@register.filter
def add_class(value, css_class):
string = unicode(value)
match = class_re.search(string)
if match:
m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class,
css_class, css_class),
match.group(1))
print match.group(1)
if not m:
return mark_safe(class_re.sub(match.group(1) + " " + css_class,
string))
else:
return mark_safe(string.replace('>', ' class="%s">' % css_class))
return value
È necessario specificare il widget esplicitamente e aggiungere la classe utilizzando attrs
keyword argument. Non c'è altro modo di cui io sappia.
Tuttavia, se questo è troppo macchinoso, è ancora possibile avvolgere il campo in un altro elemento, come div o span e aggiungere una classe a questo. Quindi modifica il tuo CSS di conseguenza.
Come ho già detto:
@register.filter def add_class(field, class_name): return field.as_widget(attrs={ "class": " ".join((field.css_classes(), class_name)) })
E nel tuo modello 'Mi piacerebbe farlo nel modello, perché il modulo può essere reso in varie apparenze! –
Per risultati ottimizzati, è consigliabile leggere i layout reattivi. I tuoi modelli e le tue classi dovrebbero rimanere invariati e tutta la magia rimane in css. –
sto ancora imparando Django, ma non potresti fare questo qualcosa di simile -
from django import forms
class SomeForm(forms.Form):
f = forms.CharField(label='x',widget=forms.TextInput(attrs={'class':'name'}))
Credo che non c'è bisogno di fare questo a livello di modello (o utilizzare filtri) a meno che non si dispone di una certa requisito che non ho capito.
È molto più semplice separare lo stile (css) dalla funzionalità (il modulo). Ad esempio, in che modo si aggiunge una classe a un campo modulo nel modello utilizzando questo metodo? Inoltre, come puoi visualizzare questo modulo in modi diversi senza duplicare il modulo, ad esempio un modulo ottimizzato per i dispositivi mobili e un modulo non adatto ai dispositivi mobili? La convalida fornita dal modulo non cambia, ma la visione di esso lo fa. – varikin
La classe CSS applicata a livello di modulo non ha alcun impatto su diversi display. La classe del form dovrebbe rimanere la stessa su qualsiasi dispositivo e dovresti avere una configurazione di file css specifica per dispositivo, quando necessario. –
Questa è la risposta corretta, per la maggior parte dei casi comunque. Non c'è bisogno di scherzare con espressioni regex! Basta forse menzionare il caso per ModelForm: 'classe Meta: widgets = {'f': forms.TextInput (attrs = {'class': 'name'}}}' – frnhr
Alcune note in più su come andare avanti con la soluzione molto pratica di Lazerscience. Ecco come appare il file con le importazioni delle importazioni:
import re
from django.utils.safestring import mark_safe
from django import template
register = template.Library()
class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])')
@register.filter
def add_class(value, css_class):
string = unicode(value)
match = class_re.search(string)
if match:
m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class,
css_class, css_class),
match.group(1))
print match.group(1)
if not m:
return mark_safe(class_re.sub(match.group(1) + " " + css_class,
string))
else:
return mark_safe(string.replace('>', ' class="%s">' % css_class))
return value
Ho incollato questo file in un file chiamato add_class.py. La struttura della directory è: mydjangoproject> general_tools_app> templatetags> add_class.py
general_tools_app è un'applicazione che raccoglie funzionalità utili come questa che aggiungo ai nuovi progetti di django.
(I general_tools_app e templatetags directory sia avere un file vuoto __init__.py
in modo che essi ottenere registrati correttamente)
In settings.py, mia INSTALLED_APPS tuple include la voce 'mydjangoproject.general_tools_app'.
Per utilizzare il filtro in un modello, aggiungo la riga {% load add_class %}
nella parte superiore del file. Se voglio aggiungere la classe 'cancella' a un campo, farei questo
{{ myfield|add_class:'delete' }}
Ho trovato la definizione' class_re' un po 'troppo avida, e ho finito in alcuni campi che la classe veniva inserita nell'attributo 'type' invece che in 'class'. La mia versione revisionata:' class_re = re.compile (r '(? <= class = ["\']) ([^" \ '] *) (["\']) ')' – DanH
Una nota di più sulle soluzioni di lazerscience: se si applica ad un <selezionare> elemento con nessun attributo class, la stringa sostituire nel caso altrimenti produrrebbe qualcosa come questo:
<select name="state" id="id_state" class="class1 class2">
<option value="AL" class="class1 class2">Alabama</option class="class1 class2">
<option value="AK" class="class1 class2">Alaska</option class="class1 class2">
<option value="AZ" class="class1 class2">Arizona</option class="class1 class2">
</select class="class1 class2">
sono abbastanza sicuro browser rottami queste definizioni estranei di classe, ma questo è un sacco di corda sostituisce quando hai solo bisogno di uno. Un rimedio semplice per questo:
return mark_safe(string.replace('>', ' class="%s">' % css_class, 1))
Questo ultimo argomento (1) farà in modo che solo la prima istanza di ">" verrà sostituito con "class =" ... ">, che è logicamente corretto per qualsiasi elemento di forma.
Ciao , grazie per l'ispirazione, credo di non averlo mai usato con un 'select' ancora! –
Hai solo bisogno di installare Django widget_tweaks
pip install django-widget-tweaks
Dopo si può fare qualcosa di simile sul modello:
{{ form.search_query|attr:"type:search" }}
-
Leggi tutto su di esso here.
Stavo cercando come aggiungere classi alle 'labels', il ricordo che è semplice aggiungerli manualmente:' ' –
Un altro modo è utilizzare il metodo as_widget
su un campo per modificarlo, più semplice e più sicuro dell'approccio regex e non richiede alcuna dipendenza aggiuntiva.
Definire un custom template filter: Ho
{{ form.first_name|add_class:"span-4" }}
È inoltre possibile utilizzare as_widget
per aggiungere altri attributi, come placeholder
, ecc
- 1. Rendering di singoli campi nel modello in un modulo personalizzato
- 2. Aggiunta di indici ai campi modello in Django con migrazioni
- 3. Velocità di rendering modello Django
- 4. Modello di rendering di Django all'interno di un modello
- 5. Aggiunta di vincoli aggiuntivi nei campi in Django
- 6. Aggiunta al "costruttore" di un modello django
- 7. Modello di rendering di Django in un pop-up
- 8. Aggiunta di campi dinamicamente in un modello di modello annidato in Rails 3
- 9. Modulo di modifica di Django basato sul modulo di aggiunta?
- 10. django - campi modulo dinamici
- 11. Modulo% in modello Django
- 12. Genera automaticamente campi modulo per un modulo in django
- 13. aggiunta di campi aggiuntivi ai moduli django-userena
- 14. Campi di modellazione del modello di Django
- 15. Aggiunta di un campo a un modello di Django esistente
- 16. Aggiunta della validazione del modello Django personalizzato
- 17. Come creare un mix di campi modello django
- 18. come eseguire il rendering di un set di query in un modello di tabella-django
- 19. Campi di accesso nel modello intermedio Django
- 20. Aggiunta di campi personalizzati a un modello django (senza modifiche nel codice sorgente)
- 21. Raggruppamento dei campi modulo Django
- 22. Posso avere un modulo Django senza il modello
- 23. Aggiunta di campi personalizzati alla tabella auth_user in Django
- 24. Aggiunta di campi personalizzati agli utenti in django
- 25. RoR: Modello di errore mancante durante il rendering JSON
- 26. Modello ERB di rendering in modello RABL
- 27. Ottieni i campi del modello in Django
- 28. Django Modello utente, aggiunta funzione
- 29. Modifica valore di un campo modulo Django durante la pulizia()
- 30. Django: come aggiungere attributi HTML arbitrari ai campi di input di un modulo?
Molto ben fatto. Per farlo funzionare per i campi che terminano con '/>', ho usato 'return mark_safe (string.replace ('', 'class ="% s "'% css_class))' - usato uno spazio invece di '>' in modo che trovi il primo spazio e inietti l'attributo prima del resto. – abstractpaper
Il regexp corrisponde avido, ma dovrebbe corrispondere pigro. Ho modificato il codice di sopra in '' class_re = re.compile (r '(? <= Class = ["\']) (. *?) (? = [" \ '])') ''. Altrimenti coincide con l'ultimo '' "' 'char invece della fine della classe. –