Как создать форму, которая отображает выпадающее меню с элементами, специфичными для этого пользователя? - PullRequest
0 голосов
/ 12 октября 2019

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

Обратите внимание, что в моем исходном коде нет ошибок, для простоты я его обобщил.

Допустим, у меня есть такая форма:

html doc:

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

Мои модели выглядят так:

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)

Затем я создал класс формы следующим образом:

form.py 

class CarSelect(forms.Modelform):

      class Meta:

        model = SavedCars

        fields = [
            'car_name',
        ]

Как видите, эта текущая настройка формы дает мне возможность выбрать ВСЕ автомобили в этой таблице, даже те, которые не назначены пользователю. Что означает в форме, каждый пользователь может выбрать любой автомобиль. Не желаемый результат. Я понимаю, что пользователю должен быть назначен набор автомобилей на выбор, поэтому я попробовал это:

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. :(

И это, очевидно, невозможно:

class SavedCars(models.Model):

   car_name = models.ForeignKey(Car.objects.filter(car_owner__user=request.user), on-delete=models.CASCADE)

1 Ответ

0 голосов
/ 12 октября 2019

Когда вы говорите "Эта текущая настройка формы дает мне возможность выбрать ВСЕ автомобили в этой таблице, даже те, которые не назначены пользователю" это на самом деле неверно. Форма модели только отображает один экземпляр модели. Если вы хотите отобразить modelformset_factory

class CarForm(forms.Modelform):

      class Meta:
        model = Car

        fields = ['car_name']

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

Теперь, когда вы инициализируете CarFormSet в своем представлении, вы можете передать набор запросов, отфильтрованный пользователем:

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})
...