2012-03-26 14 views
18

Disclaimer: Sono un principiante con Python e Django ma ho esperienza di programmazione Drupal.Principiante: Django ModelForm sostituisce il widget

Come posso ignorare il widget di default di questo:

#models.py 
class Project(models.Model): 
color_mode = models.CharField(max_length=50, null=True, blank=True, help_text='colors - e.g black and white, grayscale') 

nella mia forma con una casella di selezione? È il seguente OK o mi manca qualcosa?

#forms.py 
from django.forms import ModelForm, Select 
class ProjectForm(ModelForm): 
    class Meta: 
     model = Project 
     fields = ('title', 'date_created', 'path', 'color_mode') 
     colors = (
        ('mixed', 'Mixed (i.e. some color or grayscale, some black and white)'), 
        ('color_grayscale', 'Color/Grayscale'), 
        ('black_and_white', 'Black and White only'), 
        ) 
     widgets = {'color_mode': Select(choices=colors)} 

Dopo aver letto https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets, mi sono perso in quanto l'esempio discute solo TextArea e la discussione widget sembra escludere ModelForm.

Grazie!

risposta

58

Se si desidera ignorare il widget per un formfield in generale, il modo migliore è quello di impostare l'attributo widgets della classe ModelForm Meta:

Per specificare un widget personalizzato per un campo, utilizzare l'attributo i widget della classe Meta interna. Questo dovrebbe essere un dizionario che associa i nomi dei campi alle classi o istanze del widget.

Ad esempio, se si desidera che il un CharField per l'attributo nome dell'autore di essere rappresentato da un <textarea> invece del suo difetto <input type="text">, è possibile ignorare il widget del campo:

from django.forms import ModelForm, Textarea 
from myapp.models import Author 

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title', 'birth_date') 
     widgets = { 
      'name': Textarea(attrs={'cols': 80, 'rows': 20}), 
     } 

Il dizionario widget accetta sia istanze di widget (ad es. Textarea (...)) o classi (ad es. Textarea).

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields

Problemi correlati