我在Django有两个应用程序,其中一个应用程序的模型(ScopeItem
)在其实例创建时必须同时创建另一个应用程序模型的实例(Workflow
);也就是说,ScopeItem
包含了它的工作流。在
这是很好的工作时,从外壳尝试。创建新的ScopeItem
将创建一个Workflow
,并将其存储在ScopeItem
中。在admin中,我得到一个错误,即需要workflow
属性。属性未填充,模型定义要求设置该属性。不过,overwritedsave
方法可以做到这一点。因此,我的问题是,如何在签入管理发生之前调用save
?在
{{{myinstance,然后在cd2}中成功地创建了一个 我知道我可以在 我也不想在 以下是 和 在ScopeItem
中允许空的workflow
属性,或者合并ScopeItem
和Workflow
类,以避免管理问题。但这两种方法都会在以后引起麻烦,我希望避免此类黑客攻击。在save_item
中重复代码。仅仅从那里调用save
显然不能切断它。在scopeitems/models.py
中的代码:class ScopeItem(models.Model):
title = models.CharField(max_length=64)
description = models.CharField(max_length=4000, null=True)
workflow = models.ForeignKey(Workflow)
def save(self, *args, **kwargs):
if not self.id:
workflow = Workflow(
description='ScopeItem %s workflow' % self.title,
status=Workflow.PENDING)
workflow.save()
self.workflow = workflow
super(ScopeItem, self).save(*args, **kwargs)
workflow/models.py
:scopeitems/admin.py
我有:from django.contrib import admin
from .models import ScopeItem
from workflow.models import Workflow
class ScopeItemAdmin(admin.ModelAdmin):
list_display = ('title', 'description', 'status')
list_filter = ('workflow__status', )
search_fields = ['title', 'description']
def save_model(self, request, obj, form, change):
obj.save()
def status(self, obj):
return Workflow.STATUS_CHOICES[obj.workflow.status][1]
admin.site.register(ScopeItem, ScopeItemAdmin)
您需要从管理中使用的表单中排除该字段,以便它不会被验证。
@Daniel Roseman的回答是正确的,只要你不需要在管理中编辑工作流字段。如果您需要编辑它,那么您需要在管理表单上编写一个自定义的
clean()
方法。在表单.py
在管理员py
^{pr2}$您可以在
workflow
上设置字段blank=True
。您说过不想在
ScopeItem
中允许“空workflow
属性。”设置blank=True
是purely validation-related。因此,在后端workflow
仍然是NOT NULL
。来自Django文档:参考您的例子,您应该能够使用:
相关问题 更多 >
编程相关推荐