Home > Enterprise >  Django - Filtering Post Form option by currently logged-in User's Vehicle
Django - Filtering Post Form option by currently logged-in User's Vehicle

Time:05-05

I'm a django newbie and i'm making a form where a User can make a Post and pick one of his Vehicles for the Post. The Vehicle and the Post models are created like so:

*blog/models.py*

    class Post(models.Model):
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE,  null=True)

    
    def get_absolute_url(self):

        return reverse('post-detail', kwargs ={'pk': self.pk} )

*vehicles/models.py*

class Vehicle(models.Model)*:

     
    TESLA = 'TESLA'
    MAZDA = 'MAZDA'
    VOLVO = 'VOLVO'
    VEHICLE_CHOICES = (
        (TESLA, "Tesla"),
        (MAZDA, "Mazda"),
        (VOLVO, "Volvo"),
        )

    owner =  models.ForeignKey(User, on_delete=models.CASCADE) 
    
    model = models.CharField(max_length=9,
       
                    choices=VEHICLE_CHOICES,
                    default=TESLA)

    def __str__(self):
            return self.model

My blog views:

*blog/views.py*

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = [ 'vehicle']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

I would like to filter the vehicles so that only the current logged in User's vehicles show up in the form, i've tried a variety of different solutions but I seem to be going around in circles, if you could help me out that would be awesome. Thanks!

CodePudding user response:

Since you are using createview, you can create a form in forms.py. First you have to send the logged in user to the form, then in the form, pop the user from kwargs and use it to filter the vehicles.

views.py

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    form_class = PostForm

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)


class PostForm(forms.ModelForm):
    
    class Meta:
        model = Post
        fields = ['vehicle']
    
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        self.fields['vehicle'].queryset = Vehicle.objects.filter(owner=user)
  • Related