djangodjango-formsbootstrap-5django-crispy-forms

BooleanField form Checkboxes always empty in Django


I have a Model form that has some checkboxes.

The database has values for these records for all rows.

My form displays with empty checkboxes all the time.

I can submit values via the checkbox and the database updates correctly, but form still shows empty checkboxes.

What am I missing here?

Model definition contains

    is_coach = models.BooleanField(default=False, blank=True)
    is_parent = models.BooleanField(default=False, blank=True)
    is_committee = models.BooleanField(default=False, blank=True)

Form is forms.ModelForm containing

    is_committee = forms.BooleanField(required=False)
    is_coach = forms.BooleanField(required=False)
    is_parent = forms.BooleanField(required=False)

HTML template contains

    <form action="{% url 'user_profile_admin' %}" method="post">
      {% csrf_token %}{{ form|crispy}}
      <button type="submit" class="btn btn-success">Update</button>
      <button type="button" onclick="window.location='members';return false;"class="btn btn-danger">Cancel</button>
    </form>

My view is

@login_required(login_url="/login")
def user_profile_admin(request):
    print("request ", request.POST)

    if request.method == "POST":
        user_id = request.POST.get("user_id")
        if user_id != None:
            user_object = User.objects.get(pk=user_id)

        email = request.POST.get("email")
        if email != None:
            user_object = User.objects.get(email=email)
    
        athletes = user_object.athletes.all() #athletes for the user being updated

        form = UserAdminForm(request.POST  or None, instance=user_object) 

        if form.is_valid():
            user_object = form.save()

            success_message="You have updated profile for user : "+email +" successfully"
            messages.success(request, success_message)
            return redirect('members')
        else:

            print(form.errors.as_data()) 

    else:
        form = UserAdminForm(request.POST  or None, instance=user_object) 

    form = UserAdminForm(instance=user_object) 
    return render(request, 'account/user_profile_admin_form.html', {"form": form, "athletes": athletes}) 

Link to screenshot showing checkboxes


Solution

  • Error was in the view due to not handling the initial invalid form when this code was first called. Thanks to @willeM_VanOnsem for pointing out irregularities which allowed me to find the issue and correct.

    @login_required(login_url="/login")
    def user_profile_admin(request):
    
        if request.method == "POST":
            user_id = request.POST.get("user_id")
            if user_id != None:  # this is when edit button pressed in members.html
                user_object = User.objects.get(pk=user_id)
    
            email = request.POST.get("email")
            if email != None:  # this is when the user admin form is actually submitted
                user_object = User.objects.get(email=email)
        
            athletes = user_object.athletes.all() #athletes for the user being updated
    
            form = UserAdminForm(request.POST  or None, instance=user_object) 
    
            if form.is_valid():
                user_object = form.save()
                success_message="You have updated profile for user : "+email +" successfully"
                messages.success(request, success_message)
                return redirect('members')
            else:
                print(form.errors.as_data()) # here you print errors to terminal
                user_id = request.POST.get("user_id")
                if user_id != None:  # this is when edit button pressed in members.html
                    user_object = User.objects.get(pk=user_id)
                    print("user id")
    
                email = request.POST.get("email")
                if email != None:  # this is when the user admin form is actually submitted
                    user_object = User.objects.get(email=email)
                    print("email")
    
                form = UserAdminForm(instance=user_object) 
                return render(request, 'account/user_profile_admin_form.html', {"form": form, "athletes": athletes}) 
    
        else:
            return render(request, 'members')