@damir_bashirov

Как в django сделать зависимый выбор двух полей?

Всем добрый день.

Как в Django реализовать выпадающий список при этом что бы список фильтровался по двум полям?

Файл с моделями:
class Wallet(models.Model):
    title = models.CharField(max_length=150)
    currency = models.ForeignKey(Currency, on_delete=PROTECT, verbose_name='Валюта')
    description = models.TextField(blank=True)
    user = models.ForeignKey(
        get_user_model(),
        on_delete=CASCADE,
    )

typeIncome = 'Доход'
typeExpense = 'Расход'
type_choices = [
        (typeExpense, 'Расход'),
        (typeIncome, 'Доход'),
    ] 

class Category(models.Model):
    title = models.CharField('Название', max_length=150)
    type = models.CharField(max_length=10, choices=type_choices, default=typeExpense)
    user = models.ForeignKey(
        get_user_model(),  
        on_delete=CASCADE,
    )

class Operation(models.Model):
    type = models.CharField('Тип', max_length=10, choices=type_choices, default=typeExpense)
    user = models.ForeignKey(
        get_user_model(),
        on_delete=CASCADE,
    )
    category = ChainedForeignKey(
        'Category', 
        on_delete=PROTECT, 
        chained_field="type",
        chained_model_field="type", 
        show_all=False, 
        auto_choose=True,
        verbose_name='Категория'
    )
    date = models.DateTimeField('Дата', default=datetime.now)
    wallet = models.ForeignKey(Wallet, on_delete=PROTECT, verbose_name='Кошелек')


В файле вьюшки ставлю отбор по текущему пользователю:
...
class OperationCreateView(CreateView):
    model = Operation
    context_object_name = 'operation'
    form_class = OperationCreateForm
    success_url = reverse_lazy('operations')
    template_name_suffix = '_form'

    def get_context_data(self, **kwargs):
        context = super(OperationCreateView, self).get_context_data(**kwargs)
        context['form'].fields['wallet'].queryset = Wallet.objects.filter(user=self.request.user)
        context['form'].fields['category'].queryset = Category.objects.filter(user=self.request.user) 
        return context

    def form_valid(self, form):
        object = form.save(commit=False)
        object.user = self.request.user
        object.save()
        return super(OperationCreateView, self).form_valid(form)
...


Основная задача что бы каждый пользователь видел только свои категории и свои кошельки. Соответственно при создании Операции пользователь должен видеть только свои категории соответствующему типу (только доходы или только расходы), для этого использую django-smart-selects, но получается так, что в форме создания Операции отображаются категории всех пользователей по выбранному типу и наложить фильтр только для текущего пользователя не получается.

Как в данном случае разграничить? Я пока только осваиваю django, по этому хотелось бы понят в каком направлении идти.
Спасибо.
  • Вопрос задан
  • 173 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы