Retirado da minha resposta para:
Como marcar campos de formulário com <div class = 'field_type'> no Django
class MyForm(forms.Form):
myfield = forms.CharField(widget=forms.TextInput(attrs={'class' : 'myfieldclass'}))
ou
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['myfield'].widget.attrs.update({'class' : 'myfieldclass'})
ou
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'myfield': forms.TextInput(attrs={'class': 'myfieldclass'}),
}
--- EDITAR ---
A descrição acima é a alteração mais fácil de fazer no código da pergunta original que realiza o que foi solicitado. Também impede que você se repita se você reutilizar o formulário em outros lugares; suas classes ou outros atributos funcionam apenas se você usar os métodos de formulário as_table / as_ul / as_p do Django. Se você precisar de controle total para uma renderização totalmente personalizada, isso está claramente documentado
- EDIT 2 ---
Adicionada uma nova maneira de especificar o widget e os atributos para um ModelForm.
id
. Em segundo lugar, geralmente é a responsabilidade do lado do modelo fazer isso exatamente, principalmente se você deseja acessar essa classe por meio de métodos de front-end (js, css). Eu não disse que sua resposta está errada. Na minha opinião, é apenas uma prática ruim (especialmente quando você trabalha em uma equipe com desenvolvedores de front-end e back-end).Isso pode ser feito usando um filtro de modelo personalizado. Considere renderizar seu formulário da seguinte maneira:
form.subject
é uma instância daBoundField
qual possui oas_widget()
métodoVocê pode criar um filtro personalizado
addclass
em my_app / templatetags / myfilters.py :E depois aplique seu filtro:
form.subjects
será renderizado com aMyClass
classe CSS.fonte
{{ form.subject|addclass:'myclass1 myclass2' }}
Se você não quiser adicionar nenhum código ao formulário (como mencionado nos comentários da resposta do @ shadfc), é certamente possível, aqui estão duas opções.
Primeiro, basta referenciar os campos individualmente no HTML, em vez de todo o formulário de uma vez:
(Observe que eu também mudei para uma lista não classificada .)
Segundo, observe nos documentos sobre saída de formulários como HTML , Django:
Todos os seus campos de formulário já têm um ID exclusivo . Portanto, você faria referência ao id_subject em seu arquivo CSS para estilizar o campo de assunto . Devo observar que é assim que o formulário se comporta quando você usa o HTML padrão , o que requer apenas a impressão do formulário, não os campos individuais:
Veja o link anterior para outras opções ao imprimir formulários (você pode criar tabelas, etc.).
Nota - Eu sei que isso não é o mesmo que adicionar uma classe a cada elemento (se você adicionou um campo ao formulário, você também precisará atualizar o CSS) - mas é fácil o suficiente referenciar todos os campos por id no seu CSS assim:
fonte
Por esta postagem do blog, você pode adicionar classes css aos seus campos usando um filtro de modelo personalizado.
fonte
Você pode fazer assim:
Espero que funcione.
Ignas
fonte
Você poderia usar esta biblioteca: https://pypi.python.org/pypi/django-widget-tweaks
Ele permite que você faça o seguinte:
fonte
render_field
.Você pode fazer:
Em seguida, você pode adicionar classes / IDs, por exemplo, ao
<td>
tag. Obviamente, você pode usar outras tags que desejar. Marque Trabalhando com formulários Django como um exemplo do que está disponível para cada umfield
no formulário ({{field}}
por exemplo, está apenas emitindo a tag de entrada, não a etiqueta e assim por diante).fonte
Uma solução é usar o JavaScript para adicionar as classes CSS necessárias depois que a página estiver pronta. Por exemplo, estilizando a saída do formulário django com classes de inicialização (jQuery usado por questões de brevidade):
Isso evita a feiura de misturar detalhes de estilo com sua lógica de negócios.
fonte
Escreva seu formulário como:
No seu campo HTML, faça algo como:
Então, no seu CSS, escreva algo como:
Espero que esta resposta valha a pena tentar! Observe que você deve ter escrito suas visualizações para renderizar o arquivo HTML que contém o formulário.
fonte
Você pode não precisar substituir sua classe de formulário '
__init__
, porque o Django definename
eid
atributos nos HTMLinput
s. Você pode ter CSS como este:fonte
id
campo criado por Django para formsets fica bastante peludo ...Não vi esse realmente ...
https://docs.djangoproject.com/en/1.8/ref/forms/api/#more-granular-output
Saída mais granular
Os métodos as_p (), as_ul () e as_table () são simplesmente atalhos para desenvolvedores preguiçosos - não são a única maneira que um objeto de formulário pode ser exibido.
classe BoundField Usado para exibir HTML ou acessar atributos para um único campo de uma instância do Form.
O método str () ( unicode no Python 2) desse objeto exibe o HTML para este campo.
Para recuperar um único BoundField, use a sintaxe de pesquisa de dicionário no seu formulário usando o nome do campo como chave:
Para recuperar todos os objetos BoundField, itere o formulário:
A saída específica do campo respeita a configuração auto_id do objeto de formulário:
fonte
Existe uma ferramenta muito fácil de instalar e ótima feita para o Django que eu uso para estilizar e pode ser usada para qualquer estrutura de front-end como Bootstrap, Materialize, Foundation, etc. É chamada de widget-tweaks Documentação: Widget Tweaks
de formulários de importação de django
Em vez de usar o padrão:
Você pode editá-lo à sua maneira, usando o atributo render_field, que oferece uma maneira mais semelhante a html de denominá-lo como este exemplo:
template.html
Esta biblioteca oferece a oportunidade de separar o front-end do seu back-end
fonte
No Django 1.10 (possivelmente antes também), você pode fazer o seguinte.
Modelo:
Formato:
Modelo:
fonte
Edit: Outra maneira (um pouco melhor) de fazer o que estou sugerindo é respondida aqui: Django form input field styling
Todas as opções acima são impressionantes, apenas pensei em incluir essa porque é diferente.
Se você deseja estilo, classes, etc. personalizados em seus formulários, pode fazer uma entrada html no seu modelo que corresponda ao seu campo de formulário. Para um CharField, por exemplo, (o widget padrão é
TextInput
), digamos que você queira uma entrada de texto com aparência de inicialização. Você faria algo assim:<input type="text" class="form-control" name="form_field_name_here">
E desde que você coloque o nome do campo de formulário correspondente ao
name
atributo html (e o widget provavelmente também precise corresponder ao tipo de entrada), o Django executará todos os mesmos validadores nesse campo quando você executarvalidate
ouform.is_valid()
eO estilo de outras coisas, como marcadores, mensagens de erro e texto de ajuda, não requer muita solução, pois você pode fazer algo como
form.field.error.as_text
estilizá-las da maneira que desejar. Os campos reais são aqueles que exigem algumas brincadeiras.Não sei se essa é a melhor maneira, ou a maneira que eu recomendaria, mas é uma maneira e pode ser certa para alguém.
Aqui está uma explicação útil dos formulários de estilo e inclui a maioria das respostas listadas no SO (como usar o attr nos widgets e ajustes de widget). https://simpleisbetterthancomplex.com/article/2017/08/19/how-to-render-django-form-manually.html
fonte
Instâncias do widget de estilo
Se você quiser fazer uma instância de widget parecer diferente de outra, será necessário especificar atributos adicionais no momento em que o objeto do widget for instanciado e designado a um campo de formulário (e talvez adicione algumas regras aos seus arquivos CSS).
https://docs.djangoproject.com/en/2.2/ref/forms/widgets/
Para fazer isso, use o argumento Widget.attrs ao criar o widget:
Você também pode modificar um widget na definição de formulário:
Ou, se o campo não for declarado diretamente no formulário (como campos de formulário de modelo), você poderá usar o atributo Form.fields:
O Django incluirá os atributos extras na saída renderizada:
fonte