Как загрузить виджет 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