【问题标题】:Preventing Django admin panel to show drop-down list in Inline display of ManyToMany relationships防止 Django 管理面板在多对多关系的内联显示中显示下拉列表
【发布时间】:2013-06-21 18:46:12
【问题描述】:

我在 Django 1.5 中有一个自引用模型,如下所示:

RELATIONSHIP_PARENT = 1
RELATIONSHIP_BLOCKED = 2
RELATIONSHIP_STATUSES = (
    (RELATIONSHIP_PARENT, 'Parent'),
    (RELATIONSHIP_BLOCKED, 'Blocked'),
) 

class Message(models.Model):
    content = models.CharField("Content", max_length=160, db_index=True)
    relationships = models.ManyToManyField('self',
        through='Relationship',
        symmetrical=False,
        related_name='related_to')

class Relationship(models.Model):
    parent_message = models.ForeignKey(Message, related_name='parent_messages')
    child_message = models.ForeignKey(Message, related_name='child_messages')
    status = models.IntegerField(choices=RELATIONSHIP_STATUSES)

我将 Django 管理员配置为在查看单个 Message 面板时将 Relationships 显示为内联,如下所示:

from django.contrib import admin
from demo.models import Message, Relationship

class RelationshipInline(admin.TabularInline):
    model = Relationship
    extra = 0
    fk_name = 'parent_message'

class MessageAdmin(admin.ModelAdmin):
    inlines = (RelationshipInline,)

admin.site.register(Message, MessageAdmin)
admin.site.register(Relationship)

我打算在表中存储许多消息(其中有很多父子连接)。每当我通过管理面板查看单个消息时,我都会看到如下内容:

如红圈所示,Django admin 收集数据库中的所有消息,并在菜单中显示为下拉列表。我已经阅读了一些防止它的方法,我发现最接近的是Representing ManyToMany relation in the Admin Panel,但是当我尝试将raw_id_fields = ('parent_message', ) 放在RelationshipInline 类下时,它似乎没有做任何事情。

如果有人可以向我推荐一个链接或资源,或者只是告诉我如何阻止 Django 显示下拉列表中的每个条目/消息,我将非常感谢您的帮助。谢谢。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    这应该可行。

    class RelationshipFormSet(BaseInlineFormSet):
        def get_queryset(self):
            if not hasattr(self, '_queryset'):
                criteria = {} #Your criteria here
                qs = super(RelationshipFormSet, self).get_queryset().filter(**criteria)
                self._queryset = qs
            return self._queryset
    
    class RelationshipInline(admin.TabularInline):
        model = Relationship
        extra = 0
        fk_name = 'parent_message'
        formset =  RelationshipFormSet
    

    【讨论】:

    • 谢谢。这是一个非常详细和直接的答案。但是由于我是新手,所以我想问一下我应该在{} 中添加什么。那是 Python 代码 sn-p(类似于函数式语言风格)吗?如果是这样,除了当前设置的消息(在上图中,它是message 2)之外,我应该写什么来阻止其他所有内容(消息)? raw_id_fields 是一个选项吗?我知道这可能无法回答,并且可能要求太多;我只是问,因为我不确定发生了什么。再次感谢你。 :)
    • 标准可以是:name__startswith='a' 之类的。它们是您将在任何查询集过滤器中使用的普通过滤器标准。我不相信您在这种方法中需要raw_id_fields
    • 明白!非常感谢您的时间和耐心的回答。 :)
    • 另外,如果您不介意,能否请您快速检查一下这个 [问题] (stackoverflow.com/questions/17242698/…) 并确认现有答案是否准确?谢谢@karthikr。
    • 谢谢你,@karthikr。在确认为正确答案之前,我想与您确认。有一个美好的周末。 :)
    【解决方案2】:

    raw_id_fields 应该放在管理类中:

    admin.py

    class MessageAdmin(admin.ModelAdmin):
        inlines = (RelationshipInline,)
        raw_id_fields = ('parent_message', )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2021-11-13
      相关资源
      最近更新 更多