Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access foreign key fields from Admin Tabular Inline

I'm trying to access a field of a foreign key within a Tabular Inline in the Django Admin.

Despite my best efforts I can't seem to get it working. My current code is:

class RankingInline(admin.TabularInline):
    model = BestBuy.products.through
    fields = ('product', 'account_type', 'rank')
    readonly_fields = ('product', 'rank')
    ordering = ('rank',)
    extra = 0

    def account_type(self, obj):
        return obj.products.account_type

Which results in:

'RankingInline.fields' refers to field 'account_type' that is missing from the form.

I have also tried using the model__field method, which I used as:

fields = ('product', 'product__account_type', 'rank')

Which results in:

'RankingInline.fields' refers to field 'product__account_type' that is missing from the form.

The models are defined as so:

class Product(BaseModel):  
    account_type = models.CharField(choices=ACCOUNT_TYPE_OPTIONS, verbose_name='Account Type', max_length=1, default='P')

class Ranking(models.Model):
    product = models.ForeignKey(Product)
    bestbuy = models.ForeignKey(BestBuy)
    rank = models.IntegerField(null=True, blank = True)

class BestBuy(BaseModel):
    products = models.ManyToManyField(Product, through='Ranking')

class BaseModel(models.Model):
    title = models.CharField(max_length = TODO_LENGTH)
    slug = models.CharField(max_length = TODO_LENGTH, help_text = """The slug is a url encoded version of your title and is used to create the web address""")

    created_date = models.DateTimeField(auto_now_add = True)
    last_updated = models.DateTimeField(auto_now = True)

What am I doing wrong?

like image 491
Jeff_Hd Avatar asked Nov 08 '12 14:11

Jeff_Hd


1 Answers

I think what you are looking for is nested inlines since you want to expand "Product" as inline within RankingInline. At present Django does not have such feature built in. This question is relevant: Nested inlines in the Django admin?

You can also look at "Working with many-to-many intermediary models" section in Django DOC. That might be useful.

Actually Django will show you a small green '+' button besides the inline product field entry which you can use to create a new product to assign to your current entry for BestBuy. This might be an alternative for you to use.

like image 123
maulik13 Avatar answered Sep 25 '22 13:09

maulik13