Django - 按当前登录用户的车辆过滤 Post 表单选项

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

我是 django 新手,我正在制作一个表格,用户可以在其中制作 Post 并为 Post 选择他的车辆之一。 Vehicle 和 Post 模型是这样创建的:

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