【问题标题】:Passing data through Django forms通过 Django 表单传递数据
【发布时间】:2018-05-21 18:33:27
【问题描述】:

我觉得我错过了明显的东西,但我无法解决!

我编写了一个自定义表单(在 django admin 之外使用),我想用它来创建/更新多个模型实例的实例以及保存条件字段。但是我似乎丢失了我的条件数据。

在我看来,我实例化了我的表单实例并将其传递到请求上下文中:-

view.py

form = MyForm(my_bool=True, pid=7)
render(request 'my_page.html', {'form': form})

forms.py

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        my_bool = kwargs.pop('my_bool', False)
        self.pid = kwargs.pop('pid', None)
        super(MyForm, self).__init__(*args, **kwargs)
        if my_bool:
            self.fields['textbox'] = forms.CharField(max_length=256)

一切正常,表单按预期呈现。现在,当我提交表单时,它会点击以下内容

view.py

 if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
        # Do Stuff

我的问题是上述代码中的表单对象不包含我的“文本框”或“pid”字段,即使我提交的表单包含。我确定我做错了什么是非常明显的,但是从大量的谷歌搜索中,我无法找到一种简单的方法来实例化表单,将一些关于我想要显示的字段的数据传递给它,并说出 id我最终希望它更新的模型,然后可以访问我在代码的帖子部分中传递的信息。

我的代码的#Do Stuff 部分应该采用我传递给表单的“pid”并使用它来获取产品,例如Product.objects.get(pk=pid),但是如果不将 pid 存储在会话中,我无法弄清楚如何从回发中访问它。

如果我的表单中出现验证错误,即 form.is_valid() 返回 false,我会再次通过我已有的表单呈现请求,这样我会看到验证错误,但是我最初传递的任何条件字段都丢失了,并且它们的值忽略。

也许我完全错了,我应该以不同的方式来做这件事。我想要实现的是一个内容输入表单,其字段会根据传递的产品类型而变化,一旦填写完毕,数据就会保存到该产品的实例中。

任何帮助都将不胜感激,我发现 Django 非常适应我迄今为止所做的任何事情,这感觉就像一个常见的用例,我一定是做错了!

我正在使用 Django v1.11 和 Python v3.6。

【问题讨论】:

  • forms.py你有self.pid它来自forms.Form?,或者你只需​​要写pid = kwargs.pop('pid', None)

标签: python django forms


【解决方案1】:

您传递了两个参数来创建表单,即 my_bool 和 pid。但是您没有在 POST 视图中传递这些参数。特别是 my_bool 是 None 因此永远不会生成文本框字段。改变

form = MyForm(request.POST)

form = MyForm(request.POST, my_bool=True, pid=7)

应该可以解决问题。

【讨论】:

  • 您好,感谢您的回复!获取相同表单以传递 request.method == 'POST' 块中的 2 个参数的唯一方法是什么?我当时不知道 my_bool 或 pid 的状态,并且想从表单中获取它们的值。您可以将任意数据传递给表单,然后在提交表单时访问该数据吗?
  • 您可以检查您的 request.POST 以查看它是否包含“文本框”的值。如果确实如此,my_bool 应该是 True。关于 pid 我不完全确定它的作用或您是否需要它。您可以将其传递给一个隐藏字段(我想 my_bool 也是如此),如果您确实需要它,它会与表单一起发回。
  • 这就是我丢失的信息!我试图从 form.cleaned_data['pid] 而不是 request.POST.get('pid')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多