【问题标题】:Unexpected values in Django admin dropdown when using multiple foreign keys使用多个外键时 Django 管理下拉列表中的意外值
【发布时间】:2012-11-05 10:19:25
【问题描述】:

下面是我的models.py。问题是在管理面板中Ingredience 模型中的User 列指向Ingredience Category 值而不是User 值。

在Ingredience 模型中,我有2 个外键。我不确定这是否是问题所在。

管理面板截图:

Models.py:

from django.db import models
from django.contrib.auth.models import User

class IngredienceCategory(models.Model):
    name = models.CharField(max_length=30)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
        verbose_name_plural = "Ingredience Categories"

    def __unicode__(self):
        return self.name


class Ingredience(models.Model):
    name = models.CharField(max_length=30)
    category = models.ForeignKey(IngredienceCategory, null=True, blank=True)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
         verbose_name_plural = "Ingredients"

    def __unicode__(self):
        return self.name


class Food(models.Model):
    name = models.CharField(max_length=30)
    ingredients = models.ManyToManyField(Ingredience)
    html_id = models.CharField(max_length=30, null=True, blank=True)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
        verbose_name_plural = "Foods"

    def __unicode__(self):
        return self.name

任何想法这里有什么问题?以下是我在出现此问题之前采取的步骤:

  • 我在所有 3 个模型中添加了user 列并运行了南迁移
  • 之后,我手动将值插入到所有 3 个表中的用户列
  • 模型IngredienceCategory 和Food 工作正常(即在User 下拉列表中显示用户列表
  • 这里是 SQL:http://pastebin.com/3mHpXA3F

编辑: 要补充的东西(可能有助于解决这个问题):我注意到在管理面板的 Ingredience Model 中单击 User 列旁边的加号 (+),会显示一个添加新用户的弹出表单,这是正确的。

编辑 2: admin.py 文件相关部分:

class IngredienceAdmin(admin.ModelAdmin):
    search_fields = ('name',)
    list_filter = ('category',)
    ordering = ('name',)

#    def formfield_for_foreignkey(self, db_field, request, **kwargs):
#        #if db_field.name == 'ingrediencecategory':
#        kwargs['queryset'] = IngredienceCategory.objects.order_by('name')
#        return super(IngredienceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'ingrediencecategory':
            kwargs['queryset'] = IngredienceCategory.objects.order_by('name')
            return super(IngredienceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

        if db_field.name == 'user':
            kwargs['queryset'] = User.objects.order_by('name')
            return super(IngredienceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

【问题讨论】:

    标签: django django-models django-admin django-south


    【解决方案1】:

    您的管理模型是什么样的?

    您的模型看起来不错,我不明白您为什么会遇到这个问题。一个模型可以有多个外键,这很正常。

    我将它们放入一个项目中查看(使用空白管理模型),但无法重现。

    【讨论】:

    • 我将admin.py的内容添加到原问题中。
    • 真的很抱歉,原来我添加了错误的 admin.py 文件。现在添加了正确的文件(参见 EDIT 2)。
    【解决方案2】:

    回答我自己的问题。如果有人遇到类似的问题,这里是可行的解决方案(admin.py):

    class IngredienceAdmin(admin.ModelAdmin):
        search_fields = ('name',)
        list_filter = ('category',)
        ordering = ('name',)
    
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'ingrediencecategory':
                kwargs['queryset'] = IngredienceCategory.objects.order_by('name')
    
            if db_field.name == 'user':
                kwargs['queryset'] = User.objects.order_by('username')
    
            return super(IngredienceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2015-05-25
      相关资源
      最近更新 更多