我觉得我错过了明显但我无法解决的问题!
我编写了一个自定义表单(在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
我的问题是上面代码中的表单对象不包含我的'textbox'或'pid'字段,即使我提交的表单也是如此。我确定无论我做错什么都是非常明显但是从大量的谷歌搜索我无法找到一个简单的方法来实例化一个表单,传递一些关于我想要显示的字段的数据以及说出的id模型我最终希望它更新,然后可以访问我在代码的后期部分传递的信息。
我的代码的#Do Stuff部分应该将我传递给表单的'pid'用于获取产品,例如Product.objects.get(pk = pid),但是没有在会话中存储pid我不知道如何从回发中访问它。
如果我的表单中出现验证错误,即form.is_valid()返回false我再次传递请求传递我已经拥有的表单,这样我看到验证错误但是我最初传递的任何条件字段都缺失了它们的值忽略。
也许我只是完全错了,我应该以不同的方式做这件事。我想要实现的是一个内容输入表单,其字段根据传递的产品类型而变化,一旦填写在表单中,就会将数据保存到该产品的实例中。
任何帮助都会非常感激,我发现Django非常适应我到目前为止所抛出的任何东西,感觉就像这样一个常见的用例,我必须做错了!
我在Django v1.11& Python v3.6。
答案 0 :(得分:0)
你传递两个参数来创建表单,即my_bool和pid。但是你没有在POST视图中传递这些参数。特别是my_bool是None,因此永远不会生成文本框字段。改变
form = MyForm(request.POST)
到
form = MyForm(request.POST, my_bool=True, pid=7)
应该这样做。