2010-08-31 3 views
2

Je suis en train de modifier l'admin ModelMultipleChoiceField afin qu'il charge les données dynamiquement. Parce que je veux charger des données dynamiquement le jeu de requête pour ModelMultipleChoiceField est vide lors de la création d'une instance du formulaire, pour cette raison lors de la validation de formulaire django se plaint que les choix ne sont pas valides car ils ne peuvent pas être trouvés dans le Queryset.Django dynamic form ValidationErorr

Y a-t-il un moyen de contourner ce problème?

FORM: 
class FormName(forms.ModelForm): 
    dinamic_field = forms.ModelMultipleChoiceField(Entry.objects.none(),widget= 
      widgets.FilteredSelectMultiple("", False)) 

    class Meta: 
     model = ModelName 
     fields = ('dinamic_field',) 

    class Media: 
     js = ('jquery.js', 'dinamic_field.js') 

VIEW:

def add(request): 
    if request.method == 'POST': 
     form = FormName(request.POST) 
     if request.is_ajax(): 
      obj = Packages.objects.get(id = form.data['package']) 
      form.fields['dinamic_field'].queryset = Entry.objects.filter(test__in =obj.all()) 
      return HttpResponse(form['dinamic_field']) 
     if form.is_valid(): 
      job = form.save() 
      return HttpResponseRedirect('../../') 
    else: 
     form = FormName() 

    return return render_to_response('/template_name', {'form': 'form'}) 
+0

Pouvez-vous poster le code pour votre formulaire? –

Répondre

0

Avez-vous essayé la méthode remplaçant __init__() de votre formulaire et le réglage de la queryset pour le terrain? Quelque chose comme:

class JobForm(forms.ModelForm): 
    dynamic_field = forms.ModelMultipleChoiceField(Entry.objects.none(),widget= 
      widgets.FilteredSelectMultiple("", False)) 

    def __init__(self, *args, **kwargs): 
     super(JobForm, self).__init__(*args, **kwargs) 
     self.dynamic_field.queryset = Entry.objects.<etc> 
+0

vous avez dit méthode 'save()' et remplacé le constructeur –

+0

J'ai tring substituant le constructeur avec un argument optionnel mais cela ne fonctionne pas, quelque chose comme ceci: def __init __ (self, obj = False, * args, * * kwrds): super (FormName, auto) .__ init __ (* args, ** kwrds) self.fields ['dynamic_field']. widget = widgets.FilteredSelectMultiple ("", False) self.fields ['dynamic_field' ] .queryset = Entry.objects.none() si obj: self.fields [champ dynamique]. queryset = Entry.objects.filter (test__in = obj.all()) –

+0

@John: mon erreur. Corrigée. –