在get_form()期间覆盖Django ModelForm实例中的值

时间:2014-12-16 07:34:20

标签: django django-forms django-generic-views

我有一个模型" 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中没有的任何字段都会显示错误。

如果有人能够朝着正确的方向发展,我将不胜感激。

2 个答案:

答案 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