    from django.forms import  Select
    from django.utils.html import format_html
    from django.utils.safestring import mark_safe
    from django.forms.utils import flatatt
    from itertools import chain



    class ReadOnlySelect(Select):
        """
        This should replace the Select widget with a disabled text widget displaying the value, 
        and hidden field with the actual id
        """
        def render(self, name, value, attrs=None, choices=()):
            final_attrs = self.build_attrs(attrs, name=name)
            display = "None"
            for option_value, option_label in chain(self.choices, choices):
                if str(option_value) == (value) : 
                    display = option_label 
            output = format_html('<input type=text value="%s" disabled="disabled" ><input type="hidden" value="%s"  %s> ' % (display, value, flatatt(final_attrs)))
        
            return mark_safe(output)

#-------------------------------------------------------------------------------------------------------------------

Example useage in in  forms.py

from sequencing.customwidgets import ReadOnlySelect

class LibraryUploadFormSetForm(ModelForm):
        example =forms.ModelChoiceField(queryset=Example.objects.none() , widget=ReadOnlySelect)

    def __init__(self,  **kwargs):    
        super(LibraryUploadFormSetForm, self).__init__(**kwargs) 
        initial = kwargs['initial']
        self.fields['example'].queryset = Sample.objects.filter(pk=initial['example]) 
        self.fields['example'].initial = initial['example'] 
 