2015-06-10 2 views
0

Как получить форму администратора для отображения значения внешнего ключа в выпадающем списке формы администратора django, а не отображать «объект имен таблицы»? Я изо всех сил пытаюсь это понять.Django: Как отобразить значение внешнего ключа в форме администратора

Примеры моего кода модели (оба содержат поле catname. Catname - PK в Parent и FK в Child).

Parent(models.Model): 
catname = models.CharField(db_column='catname', primary_key=True, max_length=255, verbose_name="catname") 
description = models.CharField(db_column='Description', max_length=255, blank=True, null=True) 

class Meta: 
    managed = False 
    db_table = 'Parent' 
    verbose_name_plural = ('Parent') 

    #def __unicode__(self): return self.catname.catname 
    def __str__(self): 
     return '%s' % (self.catname) 



class Child(models.Model): 
    description = models.CharField(db_column='VarDescription', max_length=255, blank=True, null=True) 
    cname = models.CharField(db_column='VarName', primary_key=True, max_length=255) 
    catname = models.ForeignKey(Parent, db_column='catname', blank=True, null=True) 
    def __unicode__(self): 
     return self.name 
    def child_cat(self): 
     return self.catname.catname 
    class Meta: 
     managed = False 
     db_table = 'Child' 
     verbose_name_plural = ('Child') 

Администратор выглядит следующим образом:

from django.contrib import admin 

from Library.models import Parent, Child 
# Register your models here. 

class ChildAdmin(admin.ModelAdmin): 
    list_display = ('cname','description','child_cat') 
    fields=('cname','description','child_cat') 
    search_fields = ('cname','description') 
    ordering = ('cname',) 

admin.site.register(Child,ChildAdmin) 
+1

Не могли бы вы разместить соответствующую модель и код формы? – IanAuld

+0

Вот примеры моего кода модели (оба содержат поле catname, catname - PK в Parent и FK в Child). – capri

ответ

0

Вы можете переопределить form используется ModelAdmin или даже изменить только одно поле с ModelAdmin.formfield_overrides.

Прочитайте документацию here

0

Администратор выберите виджет отображает __unicode__() метод соответствующей модели. Вы можете переопределить метод __unicode__() для отображения ключа, но это может быть не самый лучший способ для этого, так как он появится везде, где используется __unicode__().

Если вы используете ModelAdmin, один из них - определить вызываемый в вашем ModelAdmin, который возвращает значение, которое вы хотели бы видеть, и добавить, что это можно использовать для вашего ModelAdmin list_display. Например, если ваша модель Book и вы хотели бы, чтобы увидеть значение внешнего ключа в Author, вы можете сделать это:

class BookAdmin(ModelAdmin): 
    def author_pk(self, obj): 
     return self.author.pk 

    list_display = (
     'name', 
     'author_pk', 
    ) 

Другим вариантом является использование атрибута ModelAdmin.raw_id_fields, однако это изменит поведение по умолчанию виджета на вход вместо Select.

+0

Пытался сделать это с помощью моего кода, но не работал. Я привел примеры моей модели и администратора выше .. – capri

0

Проблема, вероятно, связана с допуском нулевых и пустых значений в catname. После часа поиска, наконец, я понял, почему код, который работал для всех (но OP), не работал для меня. Я получил вокруг него с простой попыткой/за исключением:

APPNAME/admin.py

from django.contrib import admin 
from . import models 


    class BookAdmin(ModelAdmin): 
     list_display = ('name', 'date', 'andwhatnot', 'author_variable') 

     def author_variable(self, obj): 
      try: 
       return self.author.blankablevariable 
      except: 
       pass 

admin.site.register(models.Book, BookAdmin) 

Надеется, что это поможет кому-то, кто имеет такую ​​же проблему. Если использовать проход, за исключением чего-то нахмурившегося - я буду рад услышать. Говорить, что я новичок, преувеличение.

Смежные вопросы