【问题标题】:Override values in Django ModelForm instance during get_form()在 get_form() 期间覆盖 Django ModelForm 实例中的值
【发布时间】:2015-02-14 11:19:21
【问题描述】:

我有一个带有通用 UpdateView 的模型“SavedSearch”。每个站点用户可以有一个保存的搜索。在网站上运行搜索时,我想让他们能够单击“保存此搜索”按钮,该按钮会将他们带到当前 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

我还尝试通过get_form_kwargs()request 传递给表单的__init__,然后在表单的init 中执行与上面几乎相同的操作。这两种策略都不会导致表单数据发生任何变化。

我还尝试将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 中的任何字段显示错误。

如果有人能推动正确的方向,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    我相信正确的方法是使用 self.object 每个 UpdateView 上的 documentation 来访问有关正在编辑的对象的属性。然后,您可以像这样在表单上设置值:

    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
    

    【讨论】:

      【解决方案2】:

      这很难理解 - 了解更多有关用户流程的详细信息会很有帮助。

      但我认为您想要做的是为表单提供初始数据,而不是更改字段实例。这可以通过覆盖视图的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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 2012-01-31
        • 2012-04-10
        • 1970-01-01
        • 2011-02-28
        • 2010-10-23
        • 2013-08-28
        相关资源
        最近更新 更多