0

我有一个 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?!

4

2 回答 2

0

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

通过父对象(即发票)获取项目的解决方案由“instance.invoice.project.id”完成

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

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

if not hasatrr(instance,'project')

if instance.project=""
但如果没有异常处理,它会引发DoesNotExists 错误。将其从if/else更改为try/except上面。


顺便提一句

真的很少见。我只是在 ActionAdmin save_model
中更改某些内容 当我尝试在那里验证实例字段时,与 try/except 中的 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 中反之亦然???!

有人可以向我解释一下吗?

于 2012-06-28T13:31:52.627 回答
0

就我而言,我想在 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 上

于 2022-01-17T11:33:29.957 回答