Aggiungi classe a forma di campo di Django ModelForm

Sto cercando di scrivere un Bootstrap Forma con Django ModelForm. Ho letto il Django Documentazione Django Documentazione sulle Forme, così ho questo codice:

<div class="form-group">
{{ form.subject.errors }}
<label for="{{ form.subject.id_for_label }}">Email subject:</label>
{{ form.subject }}</div>

Il {{form.oggetto}} è reso da Django, per esempio in CharField modello di campo, come ingresso tag,

<input type="text"....> etc.

Ho bisogno di aggiungere “form-control” classe ad ogni ingresso in modo da ottenere Bootstrap input aspetto (senza pacchetti di terze parti). Ho trovato questa soluzione Django aggiungere classe a forma di campo. C’è un modo per aggiungere una classe per ogni campo di default, senza specificare in ogni attributo della classe di classe di Form?

class ExampleForm(forms.Form):
   name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}))
   email = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}))
   address = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}))
   country = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}))

e così via ..

Grazie in anticipo.

InformationsquelleAutor José Luis | 2015-04-18



4 Replies
  1. 35

    Se non è possibile utilizzare un app di terze parti e si desidera aggiungere una classe (ad esempio, “form-control”) per ogni campo di un form in un LAVAGGIO modo, è possibile farlo in un modulo di classe __init__() metodo in questo modo:

    class ExampleForm(forms.Form):
        # Your declared form fields here
        ...
    
        def __init__(self, *args, **kwargs):
            super(ExampleForm, self).__init__(*args, **kwargs)
            for visible in self.visible_fields():
                visible.field.widget.attrs['class'] = 'form-control'

    Potrebbe essere necessario per gestire il controllo per le classi esistenti in attrs troppo, se per qualche motivo vi sarà l’aggiunta di classi, sia in modo dichiarativo e entro __init__(). Il codice di cui sopra non tiene conto del caso.

    Vale la pena di menzionare:

    È stato specificato che non si desidera utilizzare i pacchetti di terze parti. Tuttavia, mi prendo un secondo per ricordare che uno dei modi più semplici automaticamente forme di rendering in stile Bootstrap è quello di utilizzare django-croccante-forme, come questo:

    # settings.py
    CRISPY_TEMPLATE_PACK = 'bootstrap3'
    
    # forms.py
    from crispy_forms.helper import FormHelper
    class ExampleForm(forms.Form):
        # Your declared form fields here
        ...
        helper = FormHelper()
    
    # In your template, this renders the form Bootstrap-style:
    {% load crispy_forms_tags %}
    {% crispy form %}
    • Grazie a tutti, cercherò def __init__() soluzione spero che funziona.
    • Dopo aver provato la soluzione, non dimenticate di segnare una delle risposte come “accettato”, in modo che gli altri la ricerca per la stessa informazione può più facilmente trovare la risposta.
    • So che questo è vecchio. Ho provato il primo metodo e ottenuto l’errore – ‘NoneType’ oggetto non ha l’attributo ‘visible_fields’.
  2. 4

    è possibile aggiungere classi CSS in forms.py

    subject = forms.CharField(label='subject', max_length=100 , widget=forms.TextInput(attrs={'class': "form-control"}))
  3. 1

    Croccante forme sono la strada da percorrere . Consigli per Bootstrap 4. L’aggiunta di @Christian Abbott risposta, Per le forme , bootstrap, dice, utilizzare il modulo di gruppo e forme di controllo .
    Questo è il modo che ha funzionato per me .

    Mio forms.py

    class BlogPostForm(forms.ModelForm):
        class Meta:
            model = models.Post
            fields = ['title', 'text', 'tags', 'author', 'slug']
        helper = FormHelper()
        helper.form_class = 'form-group'
        helper.layout = Layout(
            Field('title', css_class='form-control mt-2 mb-3'),
            Field('text', rows="3", css_class='form-control mb-3'),
            Field('author', css_class='form-control mb-3'),
            Field('tags', css_class='form-control mb-3'),
            Field('slug', css_class='form-control'),
        )

    Mio post_create.html

    {% extends 'blog/new_blog_base.html' %}
    {% load crispy_forms_tags %}
    {% block content %}
    <div class="container">
    
    <form method='POST' enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.media }}
        {% crispy form %}
    
    <hr>
    <input type="submit" name="Save" value="Save" class='btn btn-primary'> <a href="{% url 'home' %}" class='btn btn-danger'>Cancel</a>
    </form>
    
    </div>
    {% endblock %}

    Nota : Se si utilizza CK Editor RichTextField() per il modello di campo , quindi il campo non sarà influenzato . Se qualcuno sa su di esso , fare questo aggiornamento .

  4. 0

    Un modo è quello di creare la forma di base di classe e di aggiornare manualmente il campo è un attributo all’interno di __init__ metodo.

    Altro è utilizzando biblioteche già esistenti, come questo:
    https://github.com/dyve/django-bootstrap3

    Ci sono un sacco di queste librerie intorno a github. Guardarsi intorno.

Lascia un commento