我正在从提交的表单中生成一个对象。我想将生成的<form class="form-inline pull-xs-right">
<input class="form-control" type="text" [(ngModel)]="searchKey" placeholder="Search">
<button class="btn btn-success-outline" type="submit" (click)="searchContact(searchKey)">Search</button>
</form>
<spreadsheet [contactlist]="searchedList"></spreadsheet>
作为隐藏表单元素传递给下一个表单。但是,我无法弄清楚如何将变量从AutoField
传递到post()
。我知道首先调用get_context_data()
,然后调用post()
,但将变量添加到get_context_data()
不会产生我期望的结果(self
上不存在该属性)
以下是我遇到的一个例子:
self
在def get_context_data(self, **kwargs):
context = super(MyView, self).get_context_data(**kwargs)
print self.hello
return context
def post(self, request, *args, **kwargs):
self.hello = "hello"
return HttpResponseRedirect(request.path)
中调用时, self.hello
无效。我觉得我可能会误认为get_context_data
电话,但我不确定如何渲染模板。
这是一个简单的错误,还是我应该以完全不同的方式接近这个?
答案 0 :(得分:2)
通过自己定义post
,您可以覆盖视图的默认行为。您可以看到没有调用get_context_data或任何其他类方法,因此它们自然不会被调用。
通常,您不应该覆盖特定的get或post方法。您尚未显示完整视图,因此不清楚您要尝试实现的行为,但是例如在表单视图中,您需要定义success_url
以设置表单在提交后重定向到的位置。
答案 1 :(得分:1)
您必须找到将对象ID传递到下一页的方法。想到的选项是将其放入URL或solarissmoke建议将其保存在会话中。如果你在网址中进行操作,你也可以将页面序列放在那里(对于forst表单意味着1,对于第二个表单意味着2)。
这种方法的好处在于,您可以在一个视图中覆盖所有功能:根据页面设置get_object方法中的相应字段(self.fields = [....])和模板名称get_template_names方法。
所以使用Updateview,它看起来像这样:
urls.py:
....
url(r'^mysite/(?P<object_no>\d+)/(?P<form_no>\d+)$', BaseView.as_view()),
views.py:
class BaseView(UpdateView):
def get_object(self):
obj=MyModel.objects.get(id=self.kwargs['object_no'])
form_no = self.kwargs['form_no']
if form_no=="1":
self_fields=["field1","field2"...]
.....
def get_object(self):
obj=MyModel.objects.get(id=self.kwargs['object_no'])
form_no = self.kwargs['form_no']
if form_no=="1":
self_fields=["field1","field2"...]
.....
return obj
def get_template_names(self):
from_no = self.kwargs['form_no']
if form_no=="1":
return ["template1.html"]
....
您必须确保所有字段都为空。