【问题标题】:Django: How to set initial values for a field in an inline model formset?Django:如何为内联模型表单集中的字段设置初始值?
【发布时间】:2010-12-02 18:37:05
【问题描述】:

我有一个我认为应该是一个简单的问题。我有一个内联模型表单集,我想让一个选择字段具有当前登录用户的默认选择值。在视图中,我使用的是 Django 的 Authentication 中间件,因此获取用户只是访问request.user 的简单问题。

不过,我无法弄清楚的是,如何在包含用户列表的选择框 (ModelChoiceField) 中将该用户设置为默认选定值。谁能帮我这个?

【问题讨论】:

    标签: python django default-value django-forms


    【解决方案1】:

    这可以解决问题。它通过设置所有“额外”表单的初始值来工作。

    formset = MyFormset(instance=myinstance)
    user = request.user
    for form in formset.forms:
        if 'user' not in form.initial:
            form.initial['user'] = user.pk
    

    【讨论】:

      【解决方案2】:

      我不确定如何在内联表单集中处理此问题,但以下方法适用于普通表单和模型表单:

      您不能将其设置为模型定义的一部分,但可以在表单初始化期间进行设置:

      def __init__(self, logged_in_user, *args, **kwargs):
          super(self.__class__, self).__init__(*args, **kwargs)
          self.fields['my_user_field'].initial = logged_in_user
      
      ...
      
      form = MyForm(request.user)
      

      【讨论】:

      • 不确定这将如何与内联表单集一起使用。我正在使用 inlineformset_factory 创建我的表单集并将其传递给表单类,而不是实例。所以我没有在任何地方直接实例化一个表单对象,也不知道如何将构造函数参数传递给它。
      • 嗯...我相信 ModelForms 将采用“默认”值,不是吗?正如您所展示的,标准表单字段使用初始,但据我所知,没有理由使用 super() 。
      • 这太棒了!我正在寻找一种将数据从表单发送到视图的方法,以便我可以发送将使用消息框架显示的状态。在表单中我使用了初始关键字,然后在视图中我在 validate 上执行了此操作: cur_key_status = form.cleaned_data['key_status'] messages.success(request, cur_key_status)
      【解决方案3】:

      我在上面使用 Rune Kaagaard 的想法,但我注意到表单集提供了一个 extra_forms 属性:django.forms.formsets code

      @property
      def extra_forms(self):
          """Return a list of all the extra forms in this formset."""
          return self.forms[self.initial_form_count():]
      

      所以,坚持上面的例子:

      formset = MyFormset(instance=myinstance)
      user = request.user
      for form in formset.extra_forms:
          form.initial['user'] = user.pk
      

      无需测试任何初始表单,只需为额外表单提供默认值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-20
        • 1970-01-01
        • 2015-10-01
        • 2010-10-23
        • 2015-09-19
        • 1970-01-01
        • 2014-08-07
        • 2015-06-22
        相关资源
        最近更新 更多