2013-04-20 53 views
0

在我创建的应用程序中,一些用户具有“编码器”角色并分配给“分配”。
我似乎无法正常工作的是管理员将工作分配给工作分配的过程。Django - 在管理员中分配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' 

现在,当我在admin,我想创建一个任务并为其添加编码器。 然而,所有我看到试图这样做的时候是这样的:
This is what I see in the admin

我怎么能一个编码器/用户添加到任务,所以我后来让他可以在一个视图中的所有他的任务? 这可能是一个非常愚蠢的问题,但请回答,无论如何,我非常感谢任何帮助:)

回答

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 %} 

而且,貌似问题是你如何得到YOUT模式设置。在查看“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,) 
+0

这很有帮助,谢谢! 虽然我没有回答我的问题:我如何将一个或多个用户(=编码员)分配给管理员的任务?这是行不通的,我真的很想知道如何让它工作:) – LukasKawerau 2013-04-20 09:30:21

+0

好吧,看起来你已经有了这个设置。当您转到后端管理面板中的分配时,http://i.stack.imgur.com/Omhuu.png允许您将更多编码器(多个编码器)添加到单个分配中。如果我没有错,那就是你要找的东西。 – 2013-04-20 09:33:20

+0

另外,它可能是您将__unicode__作为“编码器”返回的事实。请注意,如果您在pastebin.com代码段中共享整个admin.py和models.py, – 2013-04-20 09:35:21