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