Django - Фильтрация опции Post Form по текущему автомобилю вошедшего пользователя

Я новичок в django и я делаю форму, где пользователь может сделать сообщение и выбрать один из своих автомобилей для сообщения. Модели автомобиля и сообщения создаются следующим образом:

*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

Виды моего блога:

*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)

Я хотел бы отфильтровать транспортные средства так, чтобы только транспортные средства текущего зарегистрированного пользователя отображались в форме, я пробовал множество различных решений, но кажется, что я хожу по кругу, если бы вы могли мне помочь, это было бы замечательно. Спасибо!

Поскольку вы используете createview, вы можете создать форму в forms.py. Сначала нужно отправить вошедшего пользователя в форму, затем в форме вывести пользователя из kwargs и использовать его для фильтрации транспортных средств.

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)
Вернуться на верх