我的Content
模型与many-to-many
模型的关系Tag
。当我保存Content
对象时,我想动态添加关系。我是按照以下方式做的。
def tag_content(obj):
for tag in Tag.objects.all():
print tag
obj.tags.add(tag)
obj.is_tagged = True
obj.save()
class Tag(models.Model):
name = models.CharField(max_length=255)
class Content(models.Model):
title = models.CharField(max_length=255)
is_tagged = models.BooleanField(default=False)
tags = models.ManyToManyField(Tag, blank=True)
def save(self, *args, **kwargs):
super(Content, self).save(*args, **kwargs)
@receiver(post_save, sender = Content)
def update_m2m_relationships_on_save(sender, **kwargs):
if not kwargs['instance'].is_tagged:
tag_content(kwargs['instance'])
tag_content
函数运行,但未建立m2m
关系。我使用Django 1.9.8顺便说一句。这毫无意义。我错过了什么?此外,如果我在shell中执行类似tag_content(content_instance)
的操作,那么标记已设置,因此函数正常。我想问题出在接收器上。有帮助吗?
修改的
我的问题与m2m_changed无关,正如我所说,在shell中创建一个Content对象可以完美地运行。因此,问题在于管理面板的设置。
答案 0 :(得分:0)
好的,我解决了这个问题。基本上,这与Django如何在管理面板中处理其表单有关。当我尝试从admin添加内容时,我将标记字段保留为空,认为tag_content函数会处理它。然而,这正是问题所在,因为从shell创建内容标记它就好了。换句话说,将管理面板更改为这样可以解决我的问题:
from django.contrib import admin
from myapp.models import *
from django import forms
class ContentCreationForm(forms.ModelForm):
class Meta:
model = Content
fields = ('title',)
class ContentChangeForm(forms.ModelForm):
class Meta:
model = Content
fields = ('title', 'is_tagged', 'tags')
class ContentAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if obj is None:
return ContentCreationForm
else:
return ContentChangeForm
admin.site.register(Tag)
admin.site.register(Content, ContentAdmin)
尝试创建新内容时,仅显示“标题”字段。这解决了这个问题。