django-admin - Django 管理员 : Many-to-Many listbox doesn't show up with a through parameter

标签 django-admin many-to-many 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)

在管理站点中,当我添加/更改论坛时,我没有看到您期望的消息列表框。但是,如果我删除 ManyToManyField 声明中的“through”参数,它就会显示出来。那是怎么回事?我已经在 admin.py 中将所有三个模型(加上标签)注册到管理站点。

TIA

最佳答案

文档说:

When you specify an intermediary model using the through argument to a ManyToManyField, the admin will not display a widget by default.



但是即使 through 也可能在管理更改 View 中显示 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

关于django-admin - Django 管理员 : Many-to-Many listbox doesn't show up with a through parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2854350/

相关文章:

python - 在 Django ModelAdmin 中列出相关字段

来自manytomanyfield中间表的django数据

django - 在 Django Admin 中将 csv 数据导入数据库

mysql - 多对多选择

java - 统计Hibernate中多对多表中ID的出现次数

mysql - SQL n :n - best practice for queries in junction table

django - 在 Django 的 manytomany 字段中分组

python - Django:有没有办法让 ManyToManyField 中的 "through"模型与包含 ManyToManyField 的模型在不同的应用程序中?

python - django-admin 中的模型描述

django - 在 django admin 中隐藏 "add", "change", "delete" Action