Как реализовать зависимый выпадающий список с Django CreateView? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь создать CreateView для одной из моих моделей "службы".Моя модель «обслуживания» имеет внешний ключ к модели «актива».Модель "актив" имеет внешний ключ для текущего пользователя.

Я хотел бы заполнить раскрывающийся список «Service» CreateView всеми «активами», принадлежащими текущему вошедшему в систему «пользователю».

Модель сервиса

class Service(models.Model):
    name = models.CharField(max_length=100)
    category = models.CharField(max_length=100)
    provider = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    asset = models.ForeignKey(Asset, on_delete=models.CASCADE)

Модель активов

class Asset(models.Model):
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    suburb = models.CharField(max_length=100)
    postcode = models.CharField(max_length=4)
    state = models.CharField(max_length=3)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

ServiceCreateView в views.py

class ServiceCreateView(LoginRequiredMixin, CreateView):
    model = Service
    fields = ['name', 'category', 'provider', 'asset']

Если я использую 'актив' в полях, я получаю все активы, добавленные в раскрывающийся список.Мне нужно, чтобы это были только активы, принадлежащие текущему пользователю.

Любая помощь в этом очень ценится.

Спасибо.

(я использую Django 2.2)

1 Ответ

1 голос
/ 26 апреля 2019

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

views.py:

class ServiceCreateView(LoginRequiredMixin, CreateView):
    form_class = ServiceCreateForm
    template_name = 'service_form.html'

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

Создайте ModelForm с теми же полями и моделью, которые примут экземпляр user при инициализации и соответствующим образом отфильтруют поле asset.

forms.py:

class ServiceCreateForm(forms.ModelForm):
    class Meta:
        model = Service
        fields = ['name', 'category', 'provider', 'asset']

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)

        self.fields['asset'].queryset = self.fields['asset'].queryset.filter(
            owner=user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...