Выпадающий список полей внешнего ключа Django admin только «тестовый объект»

#django #django-admin

#django #django-admin

Вопрос:

У меня есть эти два класса:

 class Test(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User)
    groups = models.ManyToManyField(Group)

class TestSubjectSet(models.Model):
    id =  models.AutoField(primary_key=True)
    test = models.ForeignKey(Test)
    subject = models.ManyToManyField(Subject)
  

В тестовом списке формы TestSubjectSet отображается только строка «тестовый объект».

Ответ №1:

Вы должны добавить методы __unicode__(self) or __str__(self) в свой класс models.

http://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs#django.db.models.Модель.unicode

Комментарии:

1. __unicode__(self) у меня не сработало, но __str__(self) сработал . Я использую django 11

Ответ №2:

Возникла та же проблема. Добавление

 def __str__(self):
    return self.user
  

решена проблема.

Ответ №3:

Иногда вы хотите, чтобы из функции str возвращалась другая информация, но хотите показать другую информацию в выпадающем списке admin. Тогда вышеупомянутое решение не будет работать.

Вы можете сделать это, создав подкласс forms.ModelChoiceField, подобный этому.

 class TestChoiceField(forms.ModelChoiceField):
 def label_from_instance(self, obj):
     return "Test: {}".format(obj.id)
  

Затем вы можете переопределить formfield_for_foreignkey

 def formfield_for_foreignkey(self, db_field, request, **kwargs):
  if db_field.name == 'test':
    return TestChoiceField(queryset=Test.objects.all())
  return super().formfield_for_foreignkey(db_field, request, **kwargs)