2010-11-16 22 views
2

J'ai un champ défini dans mon modèle-MultipleChoiceField avec le widget SelectMultiple "La valeur [...] n'est pas un choix valide."

languages = models.CharField(max_length = 30, choices=LANGUAGE_CHOICES, blank = True, null = True) 

Les choix sont simple-

LANGUAGE_CHOICES = (
    ('English', 'English'), 
) 

Je définir un ModelForm sur ce modèle et remplacer les feld

languages = forms.MultipleChoiceField(choices=LANGUAGE_CHOICES, widget=forms.SelectMultiple) 

Lorsque Je remplis le formulaire, sélectionne "Anglais", et essaie de soumettre, je reçois une erreur-

langues
Valeur u "[u'English ']" n'est pas un choix valide

Y a-t-il quelque chose de bas que je fais de mal? Ou le MultipleChoiceField combiné avec le widget SelectMultiple n'est-il pas le chemin à parcourir?

De plus, y a-t-il une raison pour que le choix des tuple ne puisse pas avoir deux fois la même valeur, comme je l'ai maintenant ('English', 'English')?

Voici un code supplémentaire qui pourrait être utile pour aller au fond de cette

Code modèle:

<div class="abovepad"> 
<label for="id_languages">Languages:</label> 
    {{form.languages}} 
</div> 

La partie des données POST avec les langues suivantes:

u'languages': [u'English'], 

Exemplaire pertinent de ModelForm:

class ProfileForm(forms.ModelForm):   
languages = forms.MultipleChoiceField(choices=LANGUAGE_CHOICES) 
class Meta: 
    model = Student 

Comme vous le voyez, je n'ai pratiquement rien personnalisé. Dans le passé, lorsque je rencontrais ce problème, je passais à faire des éléments de la liste à des modèles, puis en utilisant des champs ManyToMany qui ne causaient pas le même problème. Pour ces exemples, avoir des éléments être des modèles logique; dans ce cas, ce n'est pas le cas. Je veux juste savoir si je fais quelque chose de mal ou si ce combo n'est pas censé fonctionner. S'il n'y a pas de vraie réponse alors mon autre option serait d'essayer de fouiller dans le code du formulaire Django pour voir pourquoi il fait ce qu'il fait.

Répondre

1

Le message d'erreur suggère qu'au lieu de contenir un tableau, languages contient une chaîne unicode contenant une représentation de ce tableau. languages doit évaluer à [u'English'] (tableau) mais à la place évalue à u"[u'English']" (chaîne unicode). Votre ModelForm inclut-il une validation personnalisée (par exemple, une fonction clean_languages) qui pourrait changer la valeur de languages?

BTW: SelectMultiple est déjà le widget par défaut pour il n'est donc pas nécessaire de spécifier le widget.

Certaines choses qui seraient utiles pour trouver la cause:

  • le code du modèle qui rend la forme
  • les données POST renvoyées par la forme
  • le code utilisé pour votre classe ModelForm
+0

Merci Jordan, pour votre réponse rapide. J'ai posté l'information pertinente ci-dessus. Ma ModelForm n'inclut rien de plus, et se débarrasser du paramètre widget explicite ne permet malheureusement pas. Il me semble que le code de validation de formulaire Django prend pour une raison quelconque le tableau dans les données POST et le convertit en une chaîne ... – dpetters

1

Je sais cela depuis plus d'un an maintenant mais j'ai pensé qu'il serait peut-être utile de tenter une réponse.

Je crois qu'il peut y avoir quelques problèmes ici, mais le problème principal est que ModelForm s'attend à ce qu'une clé de l'enregistrement de base de données ne soit pas une valeur de chaîne.

Je suggérerais de créer un formulaire au lieu de ModelForm, si vous créez un formulaire qui ne concerne pas votre base de données. Mais si vous voulez interagir avec votre base de données, utilisez ModelForm et définissez une ForeignKey dans votre modèle Student pour la relier à la table des langues, en laissant le ModelForm faire le travail pour vous.

Exemple d'application basée sur mes hypothèses de votre modèle.

your_project/example_app/models.py:

from django.db import models 

class Student(models.Model): 
    name = models.CharField(max_length=255) 
    language = models.ForeignKey('Language') 

class Language(models.Model): 
    name = models.CharField(max_length=255) 

your_project/example_app/forms.py:

from django.forms import ModelForm 
from example.models import Student 

class StudentForm(ModelForm): 
    class Meta: 
     model = Student 

documents pertinents: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#modelform

extrait:

Comme on pouvait s'y attendre, les types de champs de modèle ForeignKey et ManyToManyField sont des cas particuliers:

ForeignKey est représenté par django.forms.ModelChoiceField, qui est un ChoiceField dont les choix sont un modèle QuerySet. ManyToManyField est représenté par , qui est un MultipleChoiceField dont les choix sont un QuerySet de modèle.

7

Vous devez supprimer choices=LANGUAGE_CHOICES de votre modèle définition: ce que votre déclaration de formulaire est la liste de valeur sélectionnée, qui n'existe pas dans votre models.LANGUAGE_CHOICES

+1

Je suis surpris que cette réponse n'ait pas reçu l'attention qu'elle devrait avoir. J'ai rencontré exactement le même problème que OP et cette réponse est ce qui m'a sauvé des heures de débogage! –