wake-up-neo.net

Hinzufügen von Klassen-, ID- und Platzhalterattributen zu einem Feld in Django Modellformularen

Ich habe ein Django Modell wie unten

models.py

class Product(models.Model):
    name = models.CharField(max_length = 300)
    description = models.TextField(max_length = 2000)
    created = models.DateTimeField(auto_now_add = True)
    updated = models.DateTimeField(auto_now = True)

    def __unicode__(self):
        return self.name

forms.py

class ProductForm(ModelForm):
    class Meta:
        model = Product
        exclude = ('updated', 'created')

product_form.py (nur ein Beispiel)

 <form enctype="multipart/form-data" action="{% url 'add_a_product' %}" method="post">
         <div id="name">
           {{form.name}}
         </div> 
         <div id="description">
           {{form.description}}
         </div> 
   </form> 

Eigentlich möchte ich die HTML-Ausgabe wie folgt anzeigen/rendern

<input id="common_id_for_inputfields" type="text" placeholder="Name" class="input-calss_name" name="Name">

<input id="common_id_for_inputfields" type="text" placeholder="Description" class="input-calss_name" name="description">

Wie fügt man nun die Attribute (ID, Platzhalter, Klasse) zu den Formularfeldern des Modells im obigen Code hinzu?

Sie können Folgendes tun:

#forms.py
class ProductForm(ModelForm):
    class Meta:
        model = Product
        exclude = ('updated', 'created')

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        self.fields['description'].widget = TextInput(attrs={
            'id': 'myCustomId',
            'class': 'myCustomClass',
            'name': 'myCustomName',
            'placeholder': 'myCustomPlaceholder'})
45

Feld-IDs sollten automatisch von Django generiert werden, um andere Felder zu überschreiben:

class ProductForm(ModelForm):
    class Meta:
        model = Product
        exclude = ('updated', 'created')

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        self.fields['name'].widget.attrs\
            .update({
                'placeholder': 'Name',
                'class': 'input-calss_name'
            })
27
mariodev

Ich mag die Antwort von Dmitriy Sintsov sehr, aber sie funktioniert nicht. Hier ist eine Version, die funktioniert:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    for field in iter(self.fields):
        self.fields[field].widget.attrs.update({
            'class': 'form-control'
    })

aktualisieren

füge diese Bedingung zum Besseren hinzu

if self.fields[field].widget.__class__.__in ('AdminTextInputWidget' , 'Textarea' , 'NumberInput' , 'AdminURLFieldWidget', 'Select'): 
     self.fields[field].widget.attrs.update({ 'class': 'form-control' })
23
Derick Hayes

Sie können forms.py wie folgt aktualisieren

class ProductForm(ModelForm):
    class Meta:
        model = Product
        exclude = ('updated', 'created')
        widgets={
                   "name":forms.TextInput(attrs={'placeholder':'Name','name':'Name','id':'common_id_for_imputfields','class':'input-class_name'}),
                   "description":forms.TextInput(attrs={'placeholder':'description','name':'description','id':'common_id_for_imputfields','class':'input-class_name'}),
                }  
15
kali sharma

Leicht modifizierte Version der exzellenten mariodev-Antwort, die bootstrap class zu allen Formularfeldern hinzufügt, damit ich nicht für jedes Feld manuell Formulareingabe-Widgets neu erstellen muss (short Python 3.x super ()):

class ProductForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs.update({
                'class': 'form-control'
            })
6
Dmitriy Sintsov

Als Antwort von Derick Hayes habe ich eine Klasse BasicForm erstellt, die forms.ModelForm erweitert und die bootstrap class zu jeder Form hinzufügt, die sie erweitert.

Für meine Formulare erweitere ich einfach BasicForm anstelle von model form und erhalte automatisch bootstrap Klassen für alle Formulare. Ich bin noch einen Schritt weiter gegangen und habe die Klassen an alle benutzerdefinierten CSS-Klassen angehängt, die möglicherweise bereits vorhanden sind.

class BaseModelForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
    super(BaseModelForm, self).__init__(*args, **kwargs)
    # add common css classes to all widgets
    for field in iter(self.fields):
        #get current classes from Meta
        classes = self.fields[field].widget.attrs.get("class")
        if classes is not None:
            classes += " form-control"
        else:
            classes = "form-control"
        self.fields[field].widget.attrs.update({
            'class': classes
        })
3
hurlbz

add_class Filter zum Hinzufügen einer CSS-Klasse zum Formularfeld:

 {% load widget_tweaks %}     
    <form enctype="multipart/form-data" action="{% url 'add_a_product' %}" method="post">
                 <div id="name">
                   {{form.name|add_class:"input-calss_name"}}
                 </div> 
                 <div id="description">
                   {{form.description|add_class:"input-calss_name"}}
                 </div> 
           </form> 

Django-Widget-Tweaks-Bibliothek

3
Sunny Multani

Sie können Folgendes tun:

class ProductForm(ModelForm):
    name = forms.CharField(label='name ', 
            widget=forms.TextInput(attrs={'placeholder': 'name '}))
1
Rafael Cabral