Robert H
Robert H

Reputation: 11730

How to have Django Admin render foreign key value instead of Object object

I'm at a bit of a loss on how to correctly reference foreign key values when looking at the Admin page in Django 1.8.

What I am getting:

Invoice list Note that the foreign key displays correctly in the left column, but not in the right (using for verification), nor does it show when you click into one of the records, which is where I require it to display.

Invoice change list

What I want:

I want the second image to display 4147128 instead of WorldEaseConsignee object.

Code

admin.py

from django.contrib import admin
from .models import WorldEaseConsignee, WorldEaseInvoice

class WorldEaseConsigneeAdmin(admin.ModelAdmin):
    list_display = (
        'order_number',
    )

class WorldEaseInvoiceAdmin(admin.ModelAdmin):

    @staticmethod
    def get_order_number(obj):
        return obj.order_number.order_number

    list_display = (
        'get_order_number', 'order_number_id'
    )

    search_fields = [
        'order_number__order_number',
    ]

admin.site.register(WorldEaseConsignee, WorldEaseConsigneeAdmin)
admin.site.register(WorldEaseInvoice, WorldEaseInvoiceAdmin)

models.py subset

class WorldEaseInvoice(models.Model):
    class Meta:
        verbose_name = 'WorldEase Invoice List'
        verbose_name_plural = 'WorldEase Invoice List'
        unique_together = ('order_line', 'order_number')

    order_number = models.ForeignKey(
        WorldEaseConsignee,
        to_field='order_number',
    )

    def __unicode__(self):
        return self.name

class WorldEaseConsignee(models.Model):
    class Meta:
        verbose_name = 'WorldEase Consignee List'
        verbose_name_plural = 'WorldEase Consignee List'

    order_number = models.IntegerField(
        null=False,
        blank=False,
        default=0,
        unique=True,
    )

    def __unicode__(self):
        return self.order_number # I've also tried self.name

Upvotes: 0

Views: 786

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599450

Since you are using Python 3, you should be defining __str__ methods instead of __unicode__.

Upvotes: 2

Related Questions