Suponha que eu tenho um formulário
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
Existe uma maneira de definir classes css em cada campo para que eu possa usar o jQuery com base na classe na minha página renderizada?
Eu esperava não ter que criar manualmente o formulário.
python
django
django-forms
ashchristopher
fonte
fonte
Respostas:
Ainda outra solução que não requer alterações no código python e, portanto, é melhor para designers e alterações pontuais na apresentação: django-widget-tweaks . Espero que alguém ache útil.
fonte
Respondeu minha própria pergunta. Suspiro
http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs
Não percebi que foi passado para o construtor de widgets.
fonte
Aqui está outra solução para adicionar definições de classe aos widgets depois de declarar os campos na classe.
fonte
Use django-widget-tweaks , é fácil de usar e funciona muito bem.
Caso contrário, isso pode ser feito usando um filtro de modelo personalizado.
Considerando que você processa seu formulário desta maneira:
form.subject é uma instância do BoundField que possui o método as_widget .
você pode criar um filtro personalizado "addcss" em "my_app / templatetags / myfilters.py"
E depois aplique seu filtro:
O form.subjects será renderizado com a classe css "MyClass".
Espero que esta ajuda.
EDIT 1
Atualize o filtro de acordo com a resposta de dimyG
Adicionar link django-widget-tweak
EDIT 2
fonte
get('class', None).split(' ')
falhará se a tag não tiver o atributo de classe, comoNone
é retornado. Mudá-lo paraget('class', '').split(' ')
obrasExpandindo o método apontado em docs.djangoproject.com:
Eu pensei que era problemático saber o tipo de widget nativo para cada campo e achei engraçado substituir o padrão apenas para colocar um nome de classe em um campo de formulário. Isso parece funcionar para mim:
Isso me parece um pouco mais limpo.
fonte
Se você deseja que todos os campos do formulário herdem uma determinada classe, basta definir uma classe pai, que herda
forms.ModelForm
e, em seguida, herda delaIsso me ajudou a adicionar a
'form-control'
classe a todos os campos em todos os formulários do meu aplicativo automaticamente, sem adicionar replicação de código.fonte
Aqui está uma maneira simples de alterar a exibição. adicione abaixo na visualização antes de passá-lo para o modelo.
fonte
Basta adicionar as classes ao seu formulário da seguinte maneira.
fonte
Aqui está uma variação acima, que dará a todos os campos a mesma classe (por exemplo, jquery cantos arredondados).
fonte
Você pode tentar isso ..
Você pode ver mais informações em: Widgets do Django
fonte
Caso você queira adicionar uma classe ao campo de um formulário em um modelo (não em view.py ou form.py), por exemplo, nos casos em que deseja modificar aplicativos de terceiros sem substituir suas visualizações, um filtro de modelo conforme descrito em Charlesthk resposta é muito conveniente. Mas nesta resposta o filtro de modelo substitui todas as classes existentes que o campo possa ter.
Tentei adicionar isso como uma edição, mas foi sugerido que fosse escrito como uma nova resposta.
Então, aqui está uma tag de modelo que respeita as classes existentes do campo:
fonte
Como se vê, você pode fazer isso no construtor de formulários ( função init ) ou após o início da classe do formulário. Às vezes, isso é necessário se você não estiver escrevendo seu próprio formulário e esse formulário vier de outro lugar -
fonte
Você também pode usar o Django Crispy Forms , é uma ótima ferramenta para definir formulários, caso você queira usar alguma estrutura CSS como Bootstrap ou Foundation. E é fácil especificar classes para seus campos de formulário lá.
Sua classe de formulário gostaria disso então:
fonte