Nei*_*eil 13 many-to-many django-admin manytomanyfield
我有以下型号:
class Message(models.Model):
date = models.DateTimeField()
user = models.ForeignKey(User)
thread = models.ForeignKey('self', blank=True, null=True)
...
class Forum(models.Model):
name = models.CharField(max_length=24)
messages = models.ManyToManyField(Message, through="Message_forum", blank=True, null=True)
...
class Message_forum(models.Model):
message = models.ForeignKey(Message)
forum = models.ForeignKey(Forum)
status = models.IntegerField()
position = models.IntegerField(blank=True, null=True)
tags = models.ManyToManyField(Tag, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
在管理站点中,当我去添加/更改论坛时,我没有看到您期望的消息列表框.但是,如果我删除ManyToManyField声明中的'through'参数,它会显示出来.那是怎么回事?我已将所有三个模型(加上Tag)注册到admin.py中的管理站点.
TIA
Fed*_*dor 18
文件说:
使用ManyToManyField的through参数指定中间模型时,管理员默认情况下不会显示窗口小部件.
但即使through定义了属性,也可能在管理员更改视图中显示M2M字段.
class ForumAdminForm(forms.ModelForm):
mm = forms.ModelMultipleChoiceField(
queryset=models.Message.objects.all(),
widget=FilteredSelectMultiple(_('ss'), False, attrs={'rows':'10'}))
def __init__(self, *args, **kwargs):
if 'instance' in kwargs:
initial = kwargs.setdefault('initial', {})
initial['mm'] = [t.service.pk for t in kwargs['instance'].message_forum_set.all()]
forms.ModelForm.__init__(self, *args, **kwargs)
def save(self, commit=True):
instance = forms.ModelForm.save(self, commit)
old_save_m2m = self.save_m2m
def save_m2m():
old_save_m2m()
messages = [s for s in self.cleaned_data['ss']]
for mf in instance.message_forum_set.all():
if mf.service not in messages:
mf.delete()
else:
messages.remove(mf.service)
for message in messages:
Message_forum.objects.create(message=message, forum=instance)
self.save_m2m = save_m2m
return instance
class Meta:
model = models.Forum
class ForumAdmin(admin.ModelAdmin):
form = ForumAdminForm
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9155 次 |
| 最近记录: |