我有一个模型" SavedSearch"使用通用UpdateView。每个站点用户都可以拥有一个已保存的搜索。在网站上运行搜索时,我想让他们能够点击"保存此搜索"按钮,将它们带到当前SavedSearch模型的编辑表单,并将其值替换为搜索中的值(保存在request.session.params中)。
所以,我试图在去模板的途中捕获绑定的表单并替换一些值而不用保存,这样用户就有机会编辑选项或更改他们的记住并取消。
我尝试更新get_form()中的实例字段:
def get_form(self, form_class):
form = super(SavedSearchUpdateView, self).get_form(form_class)
# if request is coming from a search form "save" click,
# replace form context data with options from search form.
if self.request.GET.get('ss_override') and self.request.session.get('params', None):
params = self.request.session["params"]
if params.get('location', None): form.instance.location_keywords = params.get('location')
# ... etc.
return form
我还尝试通过request
将__init__
传递给表单get_form_kwargs()
,然后在表单中执行与上述相同的操作在里面。这两种策略都不会对表单数据产生任何变化。
我也尝试将request
传递给get_form_kwargs()
,然后传递到__init__
:
def __init__(self, *args, **kwargs):
request = kwargs.pop('request')
super(DreamHomePreferenceForm, self).__init__(*args, **kwargs)
# if request is coming from a property search form "save" click,
# replace form context data with options from search form.
if request.GET.get('ehf_override') and request.session.get('params', None):
params = request.session["params"]
new_data = {}
if params.get('location', None): new_data['location_keywords'] = params.get('location')
self.data = self.data.update(new_data)
这也不会在表格显示中产生任何变化。我还尝试在get_form_kwargs()
中完全覆盖数据kwarg,但随后表单会立即尝试验证,并且新data
中没有的任何字段都会显示错误。
如果有人能够朝着正确的方向发展,我将不胜感激。
答案 0 :(得分:0)
这很难理解 - 了解有关用户流程的详细信息会很有帮助。
但我认为您要做的是为表单提供初始数据,而不是更改字段实例。这可以通过覆盖视图的get_initial
方法来完成,以返回字典。这将自动传递到get_form
返回的表单,因此不需要覆盖该方法。
def get_initial(self):
if self.request.GET.get('ehf_override') and self.request.session.get('params'):
initial_data = {}
...
else:
initial_data = super(SavedSearchUpdateView, self).get_initial()
return initial_data
答案 1 :(得分:0)
我认为正确的方法是在UpdateView上使用self.object
来访问有关正在编辑的对象的属性。然后,您可以在表单上设置值,如下所示:
def get_form(self, form_class=None):
form = super(UpdateView, self).get_form(form_class)
form.fields['location'].queryset = Location.objects.filter(foo=self.object.foo)
return form