【发布时间】:2013-09-14 13:04:42
【问题描述】:
我想在 manytomany 字段中添加一个默认项目列表,以防在管理员中更新时它留空。
我的问题是通过覆盖 save、save_model 或 post_save 信号来更改 manytomany 字段不起作用,因为 django 还没有完成保存子关系,只有父关系(例如Django: Custom Save method for Many-to-Many relation)。我尝试了信号m2m_changed,其他帖子中建议的解决方案,不会触发,因为如果列表留空,它就不会改变!
谁能想到另一种方法,因为我似乎在方法覆盖和信号方面已经走到了死胡同?我不介意默认列表是在表单显示在管理员之前还是之后添加的。
更新
什么不起作用:
(Fixtures 是我的 m2m 字段的名称)。
我尝试了以下建议,覆盖了各种方法。 从这个trace你可以看到fixtures已经被添加并且可以通过admin和model的许多方法看到,但是在这些方法被调用之后它们会被删除和替换。似乎没有可以覆盖的 after_everything_else 方法。
[Wed Sep 18 15:24:06 2013] [error] in save of model fixture count = 0
[Wed Sep 18 15:24:06 2013] [error] in save of overriden admin model form fixture count = 15
[Wed Sep 18 15:24:06 2013] [error] in save_model of admin fixture count = 15
[Wed Sep 18 15:24:06 2013] [error] in save of model fixture count = 15
什么有效
覆盖管理表单并将 clean_fixtures 方法放在那里。 clean_fixtures 不会被调用,它只是放在管理资源中,它必须是这样的覆盖形式:
class RankingUpdateForm(forms.ModelForm):
def clean_fixtures(self):
data = self.cleaned_data['fixtures']
# add default set of fixtures if none already there
if len(data) == 0:
return get_default_fixtures()
else:
return data
class RankingUpdateAdmin(admin.ModelAdmin):
list_display = ('rank_type','date', 'comment', 'issued')
form = RankingUpdateForm
def clean_fixtures(self):
assert False, "I'm never called!"
def save_formset(self):
assert False, "I'm never called either!"
【问题讨论】:
-
在模型的save方法中做修改也不行。
标签: django django-admin