2011-09-02 3 views
14

Dans les documents, le nullbooleanfield est représenté as a <select> box with "Unknown", "Yes" and "No" choices. Comment puis-je modifier les valeurs de select à d'autres textes plus significatifs et les mapper aux valeurs yes, no et unknown dans modelform?django: comment changer les valeurs pour nullbooleanfield dans un modelform?

Par exemple, j'ai yes_no_required = models.NullBooleanField() et je voudrais avoir 'yes I acknowledge this', 'no, I do not like this' et 'I do not know now' cartographie à oui, non et nécessaire en conséquence.

Répondre

29

J'ai passé une demi-heure une démo mettre sur pied juste pour me prouver cela fonctionne:

CHOICES = (
    (None, "I do not know now"), 
    (True, "Yes I acknowledge this"), 
    (False, "No, I do not like this") 
) 

class Demo(models.Model): 
    yes_no_required = models.NullBooleanField(choices = CHOICES) 

class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 

J'ai regardé dans le code source Django. Tout peut accepter un tableau de choix. Évidemment, pour certains de ceux qui n'ont pas de sens, mais c'est possible.

+3

On dirait que Django ajoute encore un autre choix pour Null à la FormFi choix eld, car null-attr est défini sur true. Vous devez également transmettre les choix à FormField, pour le limiter à ces choix et non à un choix nul supplémentaire. – codingjoe

+0

Cela ne semble plus fonctionner. 'TypeError: __init __() a un argument de mot clé inattendu 'choices'' –

3

Vous pouvez gérer cela sous une forme (withouth modifiant les modèles) comme ceci:

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace, 
     choices=CHOICES), 
    label='...', 
    required=False) 

Je pense qu'il est une mauvaise idée d'utiliser NullBooleanField pour les données qui peuvent être dans trois états comme: oui/non/désactivé.

Modification des données. Mais le gros problème se pose si vous voulez écrire un formulaire de recherche pour ces données.

Ensuite, les « vides » des valeurs peut avoir deux significations:

  • Ne pas prendre soin de cet attribut. Inclure toutes les lignes
  • Incluez uniquement ces lignes, où la colonne est NULL.

La solution est simple: utilisez un champ ChoiceField.

Plus de détails ici: https://github.com/guettli/programming-guidelines/blob/master/README.rst

2

Vous pouvez modifier votre widget champ dans votre ModelForm classe meta:

CHOICES = (
      (None, "I do not know now"), 
      (True, "Yes I acknowledge this"), 
      (False, "No, I do not like this"), 
      ) 
class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 
     fields = ("demo_field",) 
     widgets = { 
       'demo_field': forms.RadioSelect(choices = CHOICES), 
        } 
1

approche simple serait de changer les choix de widget dans votre formulaire:

class YourForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs) 
     new_choices = ((1, 'I do not know now'), 
         (2, 'Yes I acknowledge this'), 
         (3, 'No, I do not like this')) 
     self.fields['your_field'].widget.choices = new_choices 
Questions connexes