动态更改django的views.py文件中的表单字段

时间:2017-09-03 09:04:09

标签: python django django-forms django-views

我想知道是否有一种方法可以在views.py文件中更改模型表单,以便为表单选择创建多选下拉字段。我想从查询集的结果中设置选项字段上的每个选项。

例如: 我想在from_acct字段中有一个向下滚动选项,其中包含以下列表。 井法戈 追 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)

1 个答案:

答案 0 :(得分:1)

您可以尝试按功能为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()