【发布时间】: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)