【问题标题】:django ModelForm without all fields - fill them automatically没有所有字段的 django ModelForm - 自动填充它们
【发布时间】:2012-07-01 15:21:31
【问题描述】:

我想自动填充模型的一个字段。它拥有一个客户端 IP。

我已经定义了一个 CreateView 如下:

class MyView(CreateView):

  def post(self, request, *args, **kwargs):
    self.form_class.client_ip = request.META.get('REMOTE_ADDR')
    super(MyView, self).post(request, *args, **kwargs)

  model = MyModel   
  form_class = MyForm

和 MyForm 那样:

class MyForm(forms.ModelForm):
  class Meta:
    model = MyModel
    exclude = ('ip',)

我不知道如何填写这个排除的字段。

【问题讨论】:

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


    【解决方案1】:

    排除的字段必须手动填写。您可以查看可以添加到request.POST dict 的中间件处理器,您可以覆盖MyForm 上的__init__,[first call super],然后设置模型的ip 字段。 中间件处理器还可以添加到POST 一些其他请求级别属性,使其可供将来使用。

    【讨论】:

      【解决方案2】:

      MyView 中,您应该添加一个名为get_initial 的方法,该方法返回表单的初始值(作为字典)。例如:

      def get_initial(self):
          return { 'ip': ... }
      

      然后在创建表单时使用这些初始值。

      【讨论】:

      • 但是在 get_initial(self) 中我怎样才能获得对客户端 ip 的访问权限?
      • 您可以将其分配给视图(例如,self.client_ip = ...),然后在 get_initial 中使用它。
      • 如何将它分配给基于类的通用视图?我只有在 get 和 post 方法中有一个请求对象。
      • 您可以在这些方法中分配它,然后在self.client_ip 中使用它。这很好,因为每个视图一次仅用于一个请求。就像您在 post 方法中所做的那样,您应该将它分配到那里,然后在超类中调用 getpost
      • 是的,但是如果排除了ip字段,它看起来不起作用。
      猜你喜欢
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2018-06-25
      • 2016-12-22
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多