簡體   English   中英

動態更改Django的views.py文件中的表單字段

[英]Dynamically alter form fields in views.py file of django

我想知道是否有一種方法可以更改views.py文件中的模型表單,以為表單選擇創建多選下拉列表字段。 我想根據查詢集的結果在選擇字段上設置每個選項。

例如:我希望from_acct字段具有以下列表的向下滾動選項。.wells fargo chase tabz美國銀行

銀行列表是查詢集的結果

這是我到目前為止在views.py文件中所擁有的。

form = TransferForm()
        form.fields['from_acct'].queryset = Accounts.objects.filter(user = currentUser).all()
        message = 'please fill out the below form'
        parameters = {
            'form':form,
            'currentUser':currentUser,
            'message':message,
        }
        return render(request, 'tabs/user_balance.html', parameters)

這是forms.py文件

class TransferForm(forms.ModelForm):
    class Meta:
        model = Transfers
        fields = ['from_acct', 'to_acct', 'amount', 'memo']
        labels = {
            'from_acct':'from',
            'to_acct':'to',
        }

這是model.py文件

class Transfers(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    from_acct = models.CharField(max_length=150, default='account')
    to_acct = models.CharField(max_length=150, default='accont')
    amount = models.DecimalField(decimal_places=2, max_digits=9, default=0)
    memo = models.CharField(max_length=200, default='memo')
    frequency = models.SmallIntegerField(default=1)
    status = models.SmallIntegerField(default=1)
    create = models.DateTimeField(auto_now_add=True)

您可以嘗試按功能為CharField設置選項arg。

像那樣:

class Transfers(models.Model):
    field = models.CharField(max_length=255, choices=result_query())
    def result_query(self):
        # you can use that with self if u need transfers.pk for querying
        return Something.objects.exclude(bank_id__in=[bank.id for bank in self.banks.all())

def result_query():
    # or there if not
    return Something.objects.filter(any_field__gte=123)

當然,您可以在函數中實現任何邏輯,因此可以動態更改char字段的選項。

更新:

當然,您尚未將請求傳遞到函數中。 那應該是這樣的:

view.py:

def my_view(request):
    if request.method == 'GET':
        form = TransferForm(user=request.user)
    ...
    return something here

forms.py

class TransferForm(ModelForm):
    class Meta:
        model = Transfer

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(TransferForm, self).__init__(*args, **kwargs)
        self.fields['accounts'].choices = Accounts.objects.filter(user = currentUser).all()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM