1

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

Alasdair
  • 298,606
  • 55
  • 578
  • 516
joselegit
  • 533
  • 1
  • 14
  • 35

1 Answers1

0

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))
Alasdair
  • 298,606
  • 55
  • 578
  • 516