Добавить варианты в ListView Django - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть вид, который отображает все транзакции. У меня есть таблица с contractors, и я хочу отобразить все строки из этой таблицы в параметрах <select>. Как я могу это сделать?

Мой взгляд:

class TransactionView(CustomPermissionRequired, ListView):
    # Переопределение из MultipleObjectMixin
    model = Transaction
    context_object_name = 'transactions'
    paginate_by = 20
    login_url = '/'

    permission_required = (
        'registration2.can_see_payments',
    )

    # Переопределение из TemplateResponseMixin
    template_name = 'payments.html'

    search_fields = [
        ('contractor_name', 'deal__service__contractor__name__icontains'),
        ('from_pay_date', 'payment_date__gte'),
        ('to_pay_date', 'payment_date__lte'),
        ('tr_id', 'id__icontains')
    ]

    # Переопределение из MultipleObjectMixin
    def get_queryset(self):
        print('get_def')
        filter_args = []
        filter_kwargs = {}
        for sf in self.search_fields:
            if sf[0] is not None:
                sf_value = self.request.GET.get(sf[0])
                if sf_value:
                    filter_kwargs[sf[1]] = sf_value

        return Transaction.objects.all().select_related('currency',
                                                  'payment_source__payment_type',
                                                  'deal__service__contractor'
                                                  ).filter(*filter_args, **filter_kwargs).order_by('-id')

    def get_context_data(self, **kwargs):
        context = super(TransactionView, self).get_context_data(**kwargs)
        for sf in self.search_fields:
            if sf[0] is not None:
                context[sf[0]] = self.request.GET.get(sf[0])

        return context

Мои модели Transaction и Contractors:

class Transaction(models.Model):
    id = models.BigIntegerField(blank=True, null=False, primary_key=True)
    currency = models.ForeignKey(Currency, null=True, on_delete=models.CASCADE)
    deal = models.ForeignKey(Deal, null=True, on_delete=models.CASCADE)
    # service_instance = models.ForeignKey(ServiceInstance, null=True, on_delete=models.CASCADE)
    payment_source = models.ForeignKey(PayerPaymentSource, null=True, on_delete=models.CASCADE)
    payment_date = models.DateTimeField(blank=True, null=True)
    amount = models.IntegerField(blank=True, null=True)
    status = models.CharField(max_length=255, blank=True, null=True)
    context = models.TextField(blank=True, null=True)

class Contractors(models.Model):
    id = models.IntegerField(blank=True, null=False, primary_key=True)
    name = models.CharField(max_length=255, blank=True, null=True)

1 Ответ

0 голосов
/ 11 февраля 2020

Вы не показываете свой HTML, но вы начинаете с набора запросов, чтобы получить имена и идентификаторы подрядчика.

contractors = Contractors.objects.all().order_by('name').values_list('id, 'name')

Если вы посмотрите на list(contractors), вы увидите, что это список из двух кортежей, требуемый для choices.

Вы можете использовать его как таковое, если вы динамически строите форму, или вы можете передать ее в свой шаблон и перебрать там для создания списка параметров

{% for c in contractors %} <option ... {{c.0}} ...   {{c.1}} ... {% endfor %}

Там также forms.ModelChoiceField which IIR C принимает queryset (без values_list()) в качестве аргумента и возвращает выбранный экземпляр [Contractor] в качестве своей записи в form.cleaned_data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...