【问题标题】:Access parent object fields of save_formset and save_model访问 save_formset 和 save_model 的父对象字段
【发布时间】:2012-06-12 08:28:47
【问题描述】:

我有一个 ActionAdmin 模型,在 InvoiceAdmin 模型中用作 ActionAdminInline。

在 InvoiceModel 中,我覆盖了 save_formset,以自动设置一些值。为每个 Action 实例设置值没有问题,但我无法获取父 Invoice 的字段。

我认为它必须是 selfself.project.pk 我还尝试通过在其他线程中看到的 form.project.pk 来获取它。

我得到的错误是关于 InvoiceAdmin 中没有这样的字段。这对我来说很有意义,self 是一个 InvoiceAdmin 对象,而不是一个 Invoice 对象。我想我必须获取 Invoice 对象字段来设置 Action instance.invoice 和 instance.project。

有人知道,如何获取这个父对象的值???

看起来像这样:

class ActionAdmin(admin.ModelAdmin):
...


class ActionInlineForm(ModelForm):
    class Meta:
        model = Action
        fields = ['name','tax', 'price','duration_extern',]


class ActionInline(admin.TabularInline):
    model = Action
    form = ActionInlineForm
    extra = 0
    ordering = ('date_finished',)
    can_delete=False
    readonly_fields = ['non_editable_date_finished','non_editable_duration','get_remove_invoice_pos_link']




class InvoiceAdmin(admin.ModelAdmin):
...
...
...
  inlines = [ActionInline,]
  ...
  ...
  ...
  def save_formset(self, request, form, formset, change):
      instances = formset.save(commit=False)
      for instance in instances:
          usr = User.objects.get(id=7)
          try:
            instance.created_by = instance.created_by
          except:
            instance.created_by = usr

          try:
            instance.owner = instance.owner
          except:
            instance.owner = usr

          instance.modified_by = usr

          try:
            instance.date_created = instance.date_created
          except:
            instance.date_created = date.today

          instance.date_modified = date.today:

          ### MAN, This WORKS NOW ###
          try:
              instance.project = instance.project
          except:
            pr = Project.objects.get(id=instance.invoice.project.id)
            instance.project = pr


          actstat = ActionStatus.objects.get(id=2)
          instance.actionstatus = actstat

          try:
            instance.actioncategory = instance.actioncategory
          except:
            cat = ActionCategory.objects.get(id=9)
            instance.actioncategory = cat

          instance.done = True
          instance.billed = True    
          instance.save()
      formset.save_m2m()

这是错误信息:

AttributeError at /workflow/invoice/21/
    ...
    Exception Type:     AttributeError
    Exception Value:    'InvoiceAdmin' object has no attribute 'id'
    ...

Traceback
    form <django.forms.models.InvoiceForm object at 0x7f7f7421de10>
    instances [<Action: aaaaa>]
    self <workflow.admin.InvoiceAdmin object at 0x7f7f7421dad0>

问题在于,self 对象是 InvoiveAdmin 而不是 Invoice?我的意思是实例对象是 Action 而不是 ActionAdmin?!

【问题讨论】:

    标签: django forms django-admin django-forms inline-formset


    【解决方案1】:

    好的。我找到了 instance.invoice 的解决方案。它是正确设置的,无需执行任何操作,例如 instance.invoice。我从上面的代码中删除了“instance.invoice = self”行。

    通过“instance.invoice.project.id”的父对象,即发票来获取项目的解决方案

    所以我遍历表单操作来开发票,而不是它的 id。上面也改了。

    并且有必要使用 try,except 检查实例字段。首先我尝试了
    if not instance.project

    if not hasatrr(instance,'project')
    or
    if instance.project=""
    但如果不进行异常处理,则会引发 DoesNotExists 错误。将其从上面的 if/else 更改为 try/except


    顺便说一句

    真的很少见。我只是在 ActionAdmin save_model 中更改一些内容
    当我尝试在那里证明实例字段时,与尝试/除 save_formset 相同的方式,我不工作。

    在 save_model 中我必须这样做:

     if not instance.price:
            instance.price = instance.project.customer.price
    

    失败了

      try:
          instance.price = instance.price
      except:
          instance.price = instance.project.customer.price
    

    在 save_formset 中反之亦然??? !

    谁能给我解释一下?

    【讨论】:

      【解决方案2】:

      就我而言,我想在 save_formset 中访问父表单的详细信息。这很简单,我只使用了form.cleaned_data.get("field_name")。例如:

      def save_formset(self, request, form, formset, change):
          # `form` refers to parent form object
          if "field_name" in form.changed_data:
             if "bar" in form.cleaned_data("field_name"):
                # Do something
      

      在 Django 3.2.11 上

      【讨论】:

        猜你喜欢
        • 2011-07-25
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        相关资源
        最近更新 更多