Как загрузить виджет select с данными queryset в формах django

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

forms.py

class TransactionForm(forms.Form):
    # Payment methods
    payment_meth = []
    # form fields
    trans_amount = forms.IntegerField(label="Amount", min_value=0)
    payment_method = forms.CharField(
        label='Payment method',
        widget=forms.Select(
            choices=payment_meth
            )
    )

def __init__(self, *args, **kwargs):
    self.request = kwargs.pop('request', None)
    username = self.request.user.username
    self.get_mm_details = MMDetails.objects.filter(username=username)
    self.get_card_details = CardDetails.objects.filter(username=username)
    # add payment methods details to a dictionary
    for method in self.get_mm_details:
        entry = ()
        entry += (method.method_name,)
        entry += (method.method_name,)
        self.payment_meth.append(entry)
    for method in self.get_card_details:
        entry = ()
        entry += (method.method_name,)
        entry += (method.method_name,)
        self.payment_meth.append(entry)
    super(TransactionForm, self).__init__(*args, **kwargs)

View.py

form = TransactionForm(request=request)

Что я могу сделать, чтобы это сработало

Используйте forms.ChoiceField вместо forms.CharField, а затем установите варианты в методе init следующим образом:

class TransactionForm(forms.Form):
    # Payment methods
    payment_meth = []
    # form fields
    trans_amount = forms.IntegerField(label="Amount", min_value=0)
    payment_method = forms.ChoiceField(
        label='Payment method',
        choices=payment_meth
    )

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        username = self.request.user.username
        self.get_mm_details = MMDetails.objects.filter(username=username)
        self.get_card_details = CardDetails.objects.filter(username=username)
        # add payment methods details to a dictionary
        for method in self.get_mm_details:
            entry = ()
            entry += (method.method_name,)
            entry += (method.method_name,)
            self.payment_meth.append(entry)
        for method in self.get_card_details:
            entry = ()
            entry += (method.method_name,)
            entry += (method.method_name,)
            self.payment_meth.append(entry)
        super(TransactionForm, self).__init__(*args, **kwargs)
        self.fields['payment_method'].choices = self.payment_meth
Вернуться на верх