Django 访问save_formset和save_model的父对象字段
我有一个ActionAdmin模型,在InvoiceAdmin模型中用作ActionAdminInline 在InvoiceModel中,我覆盖save_formset,以自动设置一些值。为每个操作实例设置值没有问题,但我无法获取父发票的字段 我认为它必须是self或self.project.pk 我还试图通过在其他线程中看到的form.project.pk来获取它 我得到的错误是关于InvoiceAdmin中没有这样的字段。这对我来说很有意义,self是一个InvoiceAdmin对象,而不是Invoice对象。我想我必须获取发票对象字段来设置Action instance.Invoice和instance.project 有人知道如何获取父对象的值吗 看起来像这样: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对象,而不是
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
有人能给我解释一下吗