Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 访问save_formset和save_model的父对象字段_Django_Forms_Django Admin_Django Forms_Inline Formset - Fatal编程技术网

Django 访问save_formset和save_model的父对象字段

Django 访问save_formset和save_model的父对象字段,django,forms,django-admin,django-forms,inline-formset,Django,Forms,Django Admin,Django Forms,Inline Formset,我有一个ActionAdmin模型,在InvoiceAdmin模型中用作ActionAdminInline 在InvoiceModel中,我覆盖save_formset,以自动设置一些值。为每个操作实例设置值没有问题,但我无法获取父发票的字段 我认为它必须是self或self.project.pk 我还试图通过在其他线程中看到的form.project.pk来获取它 我得到的错误是关于InvoiceAdmin中没有这样的字段。这对我来说很有意义,self是一个InvoiceAdmin对象,而不是

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

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

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

我得到的错误是关于InvoiceAdmin中没有这样的字段。这对我来说很有意义,self是一个InvoiceAdmin对象,而不是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>
属性错误位于/workflow/invoice/21/
...
异常类型:AttributeError
异常值:“InvoiceAdmin”对象没有属性“id”
...
回溯
形式
实例[]
自己

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

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

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

所以我将表单操作遍历到invoice项目,而不是它的id。上面也对其进行了更改

而且不需要用try检查实例字段,除了。首先,我尝试了
如果不是instance.project

如果不是hasatr(instance,'project')

如果是instance.project=“”
但毫无例外地处理它会引发DoesNotExists错误。将其从if/else更改为try/except


顺便说一句

非常罕见。我只是在ActionAdminsave\u model中更改了一些内容
当我尝试在那里proove实例字段时,与在save_formset中使用try/except like的方法相同,我不起作用

在save_模型中,我必须执行以下操作:

 if not instance.price:
        instance.price = instance.project.customer.price
这失败了

  try:
      instance.price = instance.price
  except:
      instance.price = instance.project.customer.price
在save_formset中是viceversa

有人能给我解释一下吗