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)