Django 将请求数据传递给 Forms.py

Posted

技术标签:

【中文标题】Django 将请求数据传递给 Forms.py【英文标题】:Django Pass Request Data to Forms.py 【发布时间】:2020-01-25 09:29:58 【问题描述】:

场景;

我们得到了一个带有字段的表单,在表单内部有一个组合框,它填充了项目。

我们有租户,每个用户都有 TenantID,所以当 A1 用户(租户 ID 1)调用创建表单时,我们需要使用查询过滤过滤该组合框以仅过滤 A1 用户项。

其他租户也是如此。

如何传递该动态租户 ID。

顺便说一句,对于存储在抽象类 django core USER 中的每个用户租户 ID,添加了新字段租户 ID。 任何建议我都愿意接受,谢谢您的关注。

状态:已解决!

Forms.py

class ItemForm(forms.ModelForm):
    class Meta:
        model = Items
        fields = ('id', 'item', 'start', 'end')
        widgets = 
            'start': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
            'end': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
        

    def __init__(self, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        self.fields['item'].queryset = Items.objects.filter(tenantid=int(User.tenantid))

views.py

@login_required()
def create_item_record(request):
    if request.method == 'POST':
        form = ItemForm(request.POST)
    if request.method == 'GET':
        tenantidX = request.user.tenantid
        form = ItemForm()
    return save_item_form(request, form, 'items_create_partial.html')

【问题讨论】:

对于这种过滤,您可能需要使用 ajax 动态呈现它们,而不是原始的 django 表单。 应该有一种方法,至少可以在视图侧调用表单时传递参数。 您还可以将您的表单分成不同的页面,以便您可以在每个步骤中保持过滤。 你的代码不起作用怎么办?还有,为什么GwynBleidD的代码不起作用? 【参考方案1】:

只需将用户从请求传递到您的表单:

class ItemForm(forms.ModelForm):
    class Meta:
        model = Items
        fields = ('id', 'item', 'start', 'end')
        widgets = 
            'start': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
            'end': DateTimePickerInput(format='%Y-%m-%d %H:%M'),
        

    def __init__(self, user, *args, **kwargs):
        super(ItemForm, self).__init__(*args, **kwargs)
        self.fields['item'].queryset = Items.objects.filter(tenantid=int(user.tenantid))

@login_required()
def create_item_record(request):
    if request.method == 'POST':
        form = ItemForm(request.user, request.POST)
    if request.method == 'GET':
        form = ItemForm(request.user)
    return save_item_form(request, form, 'items_create_partial.html')

【讨论】:

我怎样才能接受传入的参数来形成,因为我这样做是行不通的 看我回答的表格,里面加了user参数。你应该使用它。 是的,我做了你添加的,但给出的错误对象没有属性'get' 我相信@GwynBleidD 解决方案是正确的。我建议你再给它一次机会;) @BCA 请提供该错误的回溯。否则无法为您提供帮助,因为这里没有拨打.get 电话。【参考方案2】:

使用“django -crum”https://pypi.org/project/django-crum/ 获取当前请求的最佳且简单的方法。

pip install django-crum

然后添加到 settings.py

# settings.py
MIDDLEWARE_CLASSES = (
 'crum.CurrentRequestUserMiddleware',
...
)

包含库

from crum import get_current_request

request = get_current_request()

然后你就可以通过 request.user.tenantid

到达里面的活动请求

【讨论】:

非常感谢老兄

以上是关于Django 将请求数据传递给 Forms.py的主要内容,如果未能解决你的问题,请参考以下文章

通过 Django 将 Python 数据传递给 JavaScript

Django 频道:将表单数据传递给消费者

django将数据传递给javascript的最佳方式

如何将ajax get请求数据传递给nodejs GET路由? [复制]

将文件数据传递给 C# WCF 服务函数(错误 400 错误请求)

Django Rest Framework:如何将数据传递给嵌套的序列化器并仅在自定义验证后创建对象