2010-08-31 2 views
2

Я пытаюсь изменить админ ModelMultipleChoiceField, чтобы он динамически загружал данные.Django dynamic form ValidationErorr

Поскольку я хочу динамически загружать данные, набор запросов для ModelMultipleChoiceField пуст при создании экземпляра формы, поэтому при выполнении проверки формы django жалуется, что выбор недействителен, поскольку они не могут быть найдены в QuerySet.

Есть ли способ обойти это?

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') 

ВИД:

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

Можете ли вы выслать код для своей формы? –

ответ

0

Вы пробовали перекрывая __init__() метод вашей формы и установки queryset для поля? Что-то вроде:

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

вы сказали «save()» метод и перезаписали конструктор –

+0

У меня есть tring, переопределяющий конструктор необязательным аргументом, но он не работает, примерно так: def __init __ (self, obj = False, * args, * * kwrds): super (FormName, self) .__ init __ (* args, ** kwrds) self.fields ['dynamic_field']. widget = widgets.FilteredSelectMultiple ("", False) self.fields ['dynamic_field' ] .queryset = Entry.objects.none() if obj: self.fields [dynamic_field ']. queryset = Entry.objects.filter (test__in = obj.all()) –

+0

@John: моя ошибка. Исправленный. –