django的FormView中,自定义初始化表单数据的曲折方法

这个技巧,主要是用于表单初始化及回显。

也就是说,如果用户的数据库里有数据,则要将相应的数据显示在表单里,

如果用户的数据库里没有数据,才会生成一个空白的表单给用户,

这样才显得专业塞!

而我面对的尴尬问题是:

表单数据不是对应的数据库里的一条记录,而是符合条件的多条记录。

而且,数据库的过滤条件,是通过url里定义的值,而不是固定的参数过滤。

那么,肿么办?

查文档呗~~~~!

当看完相关文档,知道是先调用get方法,再调用get_initial方法来初始化表单时,

处理问题的方案,就浮现出来了。

通过类变量作传递嘛~~~

具体操作如下:

一,在formview里定义两个类变量(因为url里对应的是两个变量)。

class AppResEditView(FormView):
    template_name = 'app/app_res_edit.html'
    context_object_name = 'app_res'
    form_class = AppResForm
    app = None
    env = None

二,在get里填充这两个变量。

    def get(self, request, *args, **kwargs):
        # 先在get方法里拿到app和env,放到类变量里,
        # 然后,在将变量传递到get_initial方法里,初始化表单数据。
        # 这样实现是因为方法调用上有先后关系,且数据库里不是对应一条记录。
        self.app = App.objects.get(name=kwargs['app'])
        self.env = Env.objects.get(name=kwargs['env'])
        return super().get(self, request, *args, **kwargs)

三,在get_initial方法里,拿出这两个变量,用来进行数据库过滤。

    def get_initial(self, *args, **kwargs):
        """
        Returns the initial data to use for forms on this view.
        """
        # 初始化表单数据
        initial = super().get_initial()
        res_list = AppEnvConfig.objects.filter(app=self.app, env=self.env)
        for item in res_list:
            initial[item.key] = item.value
        return initial
上一篇:CentOS随笔——关机命令


下一篇:org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called.