Django - 在admin中分配m2m关系

时间:2013-04-20 08:46:53

标签: django django-models m2m

在我正在构建的应用程序中,一些用户具有“编码器”角色并被分配到“作业” 我似乎无法工作的是管理员将编码器分配给分配的过程。

这是我到目前为止的模型代码(可能完全错误):

class Coder(models.Model):
"""Every user can be a coder. Coders are assigned to Assignments"""
user = models.OneToOneField(User)

class Admin:
    list_display = ('',)
    search_fields = ('',)

def __unicode__(self):
    return u"Coders"

class Assignment(models.Model):
"""(Assignment description)"""
title = models.CharField(blank=True, max_length=100)
start_year = models.IntegerField(blank=True, null=True)
end_year = models.IntegerField(blank=True, null=True)
country = models.IntegerField(blank=True, null=True)
coders = models.ManyToManyField(Coder)

class Admin:
    list_display = ('',)
    search_fields = ('',)

def __unicode__(self):
    return u"Assignment"

这是管理员代码:

class AssignmentCoderInline(admin.StackedInline):
model = Assignment.coders.through
can_delete = False
verbose_name_plural = 'coder'

class AssignmentAdmin(admin.ModelAdmin):
fieldsets = [
    ('Assignment', {'fields': ['title', 'start_year', 'end_year']})
]
inlines = (AssignmentCoderInline,)

class CoderInline(admin.StackedInline):
model = Coder
can_delete = False
verbose_name_plural = 'coder'

现在,当我在管理员中时,我想创建一个作业并为其添加编码器。 然而,我在尝试这样做时所看到的只有: This is what I see in the admin

如何在作业中添加一个编码器/用户,以便稍后在视图中向他显示​​他所拥有的所有作业? 这可能是一个非常愚蠢的问题,但无论如何请回答,我非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:1)

如果我没有弄错,看起来你想给编程人员打电话,然后显示一个用户的所有作业。

首先,我可以首先为编码器分配related_name,并为彼此分配模型关系,以便稍后轻松引用它们。

class Assignment(models.Model):
    coders = models.ManyToManyField(Coder, related_name='assignments')

class Coder(models.Model):
    user = models.OneToOneField(User, related_name="coder")

然后我会使用one to one relationship

在模板中引用用户
    {% for assignment in user.coder.assignments.all %}

此外,看起来问题是你如何设置模型。在查看“models.Model”类和“ModelBase”类的django.db.models.base之后,看起来没有“Admin”子类。你可能想要删除那些开头的。

接下来,__unicode__字段显示默认的可见值,表示屏幕上的对象。在这种情况下,你强迫它成为“编码器”。如果你有5个编码人员,你会看到“编码器,编码器,编码器,编码器,编码器”而不是“admin,user1,bob22,harry8,stadm1in”等。让我们覆盖 unicode 展示更有意义的东西。由于编码器字段只有用户字段,因此我们可以通过self.user.username来引用它。我们也会将Assignment() unicode 更改为self.title

ModelForm也没有'Admin'子类,所以让我们删除它。

MODELS:


class Coder(models.Model):
    """Every user can be a coder. Coders are assigned to Assignments"""
    user = models.OneToOneField(User, related_name='coder')

    def __unicode__(self):
        return self.user.username


class Assignment(models.Model):
    """(Assignment description)"""
    title = models.CharField(blank=True, max_length=100)
    start_year = models.IntegerField(blank=True, null=True)
    end_year = models.IntegerField(blank=True, null=True)
    country = models.IntegerField(blank=True, null=True)
    coders = models.ManyToManyField(Coder, related_name='assignments')

    def __unicode__(self):
        return self.title


ADMIN:

class AssignmentCoderInline(admin.StackedInline):
    model = Assignment.coders.through
    can_delete = False
 #   verbose_name_plural = 'coder'

class AssignmentAdmin(admin.ModelAdmin):
    fieldsets = [
        ('Assignment', {'fields': ['title', 'start_year', 'end_year']})
    ]
    inlines = (AssignmentCoderInline,)