2016-02-28 58 views
2

让我们假设我有以下模型定义:如何自定义显示内联模型admin中的ManyToManyField的标签?

class Topping(models.Model): 
    name = models.CharField(max_length=40) 

class Pizza(models.Model): 
    toppings = models.ManyToManyField(Topping) 

现在让我们假设我要注册与管理网站的型号,使用内联模型管理员允许在编辑比萨饼添加配料:

@admin.register(Topping) 
class ToppingAdmin(admin.ModelAdmin): 
    pass 

class ToppingInline(admin.TabularInline): 
    model = Pizza.toppings.through 
    verbose_name = 'topping' 
    verbose_name_plural = 'toppings' 

@admin.register(Pizza) 
class PizzaAdmin(admin.ModelAdmin): 
    exclude = ('toppings',) 
    inlines = (ToppingInline,) 

这导致了一个相当明显的问题:

enter image description here

正如你所看到的,标签是丑陋的。有没有一种方法来定制它?

回答

1

You would control what displays for an object using the __str__ or __unicode__ method.

You could manage the many to many yourself定义该属性是这样的:一种更快和更脏的替代

... 

class Pizza(models.Model): 
    toppings = models.ManyToManyField(Topping, through="PizzaToppingRelationship") 


class PizzaToppingRelationship(models.Model): 
    pizza = models.ForeignKey(Pizza) 
    topping = models.ForeignKey(Topping) 

    def __str__(self): 
     return 'Pizza Topping - {}'.format(self.topping.name) 
1

到限定的关系的模型类是重新定义__str____unicode__方法:

class ToppingInline(admin.TabularInline): 
    ... 
    Pizza.toppings.through.__str__ = lambda self: 'Topping' 
相关问题