Search code examples
djangodjango-formsdjango-viewsdjango-autocomplete-light

what does the autocomplete-light return?


I have recently installed autocomplete-light in my app.

Autocomplete filters through the field called 'name' in a table called institution. However, what is post through the view is the 'id' of the same object, not the name.

Does anyone know why that is?

My view is:

class UserAccountsUpdate(UpdateView):
    context_object_name = 'variable_used_in `add_user_accounts.html`'
    form_class = AddUserAccountsForm
    template_name = 'add_user_accounts.html'
    success_url = 'add_user_accounts.html'

    def add_user_institution_details(request):
        if request.method == 'POST':
            # create a form instance and populate it with data from the request:
            form = AddUserAccountsForm(request.POST)
            # check whether it's valid:
            if form.is_valid():
                institution_selected = Institution.objects.get(id=name)
                form.save()

        return render(request)

    #get object
    def get_object(self, queryset=None): 
        return self.request.user

The form is:

class AddUserAccountsForm(forms.ModelForm):

    name = forms.ModelChoiceField(required=True, queryset=Institution.objects.all(), widget=autocomplete_light.ChoiceWidget('InstitutionAutocomplete'), label="")

    class Meta:
        model = Institution
        fields = ('name',)

Solution

  • autocomplete-light's ChoiceWidget uses the Model's PrimaryKey for post requests by default, which in your case is id.

    Since you did not post your models.py I can only assume that name is a CharField in the Institution model and you are just using autocomplete here to simplify the adding of a name.

    To realize this use TextWidget and forms.CharField:

    class AddUserAccountsForm(forms.ModelForm):
    
        name = forms.CharField(
            required=True,
            widget=autocomplete_light.TextWidget('InstitutionAutocomplete'),
            label="",
        )
    
        class Meta:
            model = Institution
            fields = ('name',)