0

I am looking to create a form that displays a drop down menu with items specific to that user.

Please note my original code has no errors, I have summarised this one for simplicity.

So let's say I have a form like this:

html doc:

<form>
   <p>Select a car:</p>
   <p>{{ form.car_name }}</p>
</form>

My models look like this:

models.py 

class LoggedInUser(models.Model):

    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='logged_in_user', 
    on_delete=models.CASCADE)

    session_key = models.CharField(max_length=32)


class Car(models.Model):

   car_name = models.CharField(max-length=100)
   car_owner = models.ForeignKey(LoggedInUser, on-delete=models.CASCADE)


class SavedCars(models.Model):

   car_name = models.ForeignKey(Car, on-delete=models.CASCADE)

I then created the form class as such:

form.py 

class CarSelect(forms.Modelform):

      class Meta:

        model = SavedCars

        fields = [
            'car_name',
        ]

As you can see, this current form setup gives me options to select ALL cars in that table even ones that are not assigned to a user. Which means on the form, every user can select any car. Not the desired result. I understand that a user has to be assigned a set of cars to choose from, so I tried this:

class LoggedInUser(models.Model):

    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='logged_in_user', 
    on_delete=models.CASCADE)

    session_key = models.CharField(max_length=32)

    car_select = models.ManyToManyField(Car) // which detects the user selecting the car but this isn't my 
    form. :(

And this is obviously not possible:

class SavedCars(models.Model):

   car_name = models.ForeignKey(Car.objects.filter(car_owner__user=request.user), on-delete=models.CASCADE)
Corentin Pane
  • 4,794
  • 1
  • 12
  • 29
Kai
  • 45
  • 6

1 Answers1

0

When you say "This current form setup gives me options to select ALL cars in that table even ones that are not assigned to a user" this is actually incorrect. A model form only renders a single model instance. If you want to render modelformset_factory

class CarForm(forms.Modelform):

      class Meta:
        model = Car

        fields = ['car_name']

CarFormSet = forms.modelformset_factory(Car, form=CarForm)

Now when you initialize your CarFormSet in your view, you can pass in a queryset that is filtered by user:

def some_view(request):
    cars = Car.objects.filter(car_owner__user=request.user)
    form = CarFormSet(queryset=cars)
    ...
    return render(request, 'some_template.html', {'form':form})
Lord Elrond
  • 13,430
  • 7
  • 40
  • 80