#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.
Комментарии:
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)