Search code examples
djangodjango-formsdjango-viewsdjango-widget

Error saving records from ModelChoice Field in django form


I have a FormModel with an modelchoice field. The modelchoice widget is filtered based on the logged user

class ProcFTPForm(forms.ModelForm):
      #id_archivo = forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.all(),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
      class Media:
       css = {'all':('/admin/css/widgets.css',),}
       js = ('/admin/jsi18n/','admin/jquery.js')

      def __init__(self,usuario, *args, **kwargs):
          super(ProcFTPForm, self).__init__(*args, **kwargs)
          self.fields['id_archivo'] = forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.filter(usuario=usuario),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')

      class Meta:
            model = Lista_Archivos

My view

@login_required(login_url='/login/')
def archivoview(request):
    usuario = request.user
    form = ProcFTPForm(request.POST or usuario )

    if request.method == 'POST':
       form = ProcFTPForm(request.POST)
       if form.is_valid():
          form.save()
          proc = Lista_Final()
          lista = proc.archivos()
          tabla = Proc_Carga()
          sp = tabla.carga()
          return HttpResponseRedirect('/home/')

    return render_to_response('archivo.html',{'form':form},context_instance=RequestContext(request))

At this point everything works fine. the FilteredSelectMultiple widget only show choices based on the logged user But now I can't save. When I click the save button the widgets get emptied and the record is not saved.

If I change the form from this:

forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.filter(usuario=usuario),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')

to this:

forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.all(),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')

The form works fine and saves all the records from the FilteredSelectMultiple widget.

I don't know where is the error or if I miss something.

Any advice

Thanks in advance


Solution

  • You have changed the signature of your __init__ method to

    def __init__(self, usuario, *args, **kwargs):
    

    so you must always provide usuario as the first argument.

    Try changing your view to the following:

    @login_required(login_url='/login/')
    def archivoview(request):
        usuario = request.user
    
        if request.method == 'POST':
            form = ProcFTPForm(usario, request.POST)
            if form.is_valid():
                ...
                return HttpResponseRedirect('/home/')
        else:
            form = ProcFTPForm(usuario)
    
        return render_to_response('archivo.html',{'form':form},context_instance=RequestContext(request))