list_display не показывает поле email_verified в ModelAdmin Django - PullRequest
0 голосов
/ 25 июня 2018

Я отображаю список, отображающий следующие поля в Django ModelAdmin.

list_display = ['username', 'email_verified', 'cert_password', 'key_name']

в этом списке элементы - username, cert_password and key_name принадлежит модели ModelName, а элемент email_verified принадлежит другой модели ModelName2.

Но я хочу отобразить их все для администратора в ModelAdmin, поэтому для этого я создал функцию def email_verified, как показано ниже:

class UserAdmin(admin.ModelAdmin):
    list_display = ['username', 'email_verified', 'cert_password', 'key_name']
    def email_verified(self):
        return ModelName2.email_verified
    actions = [my_action_here]

Итак, когда я возвратил ModelName2.email_verified, он показывает <django.db.models.query_utils.DeferredAttribute object at 0x7efcca3b9910> в интерфейсе администратора через ModelAdmin.

Итак, я пробовал следующее:

class UserAdmin(admin.ModelAdmin):
    list_display = ['username', 'email_verified', 'cert_password', 'key_name']
    def email_verified(self,obj):
        return ModalName2.objects.get().email_verified
    actions = [my_action_here]

Но в этом случае я получил ошибку - get() returned more than one ModalName2 Итак, как я могу это сделать.

Я хочу отобразить значение email_verified в ModalAdmin (интерфейс администратора) в таблице с соответствующим именем пользователя и другими полями.

например. Что я хочу -

Username | Email_Verified | cert_password | Key_name
abcuser  | 1              | asdf          | asdf
bhdjs    | 1              | lkj           | ljk
asdff    | 0              | lkjsd         | ljl

Вот мои модалы -

class ModelName2(models.Model):
    username = models.OneToOneField(User, on_delete=models.CASCADE)
    email_verified = models.BooleanField(
        default=False,
        help_text="Valid - <b><a>True</a></b> OR <b><a>False</a></b>")

    def __unicode__(self):
        return unicode(self.username)

class ModelName1(models.Model):

    username = models.OneToOneField(User, on_delete=models.CASCADE)
    cert_password = models.CharField(
        max_length=20,
        default='',
        blank=True,
        help_text="<b><a>System Generated - Do not alter</a></b>")
    key_name = models.CharField(
        max_length=15,
        default='',
        blank=True,
        help_text="<b><a>System Generated - Do not alter</a></b>")

    def __unicode__(self):
        return unicode(self.username)

Как это сделать? Я использую Django 1.11.X

1 Ответ

0 голосов
/ 25 июня 2018

ModalName2.objects.get() должен возвращать только один объект.В противном случае это вызовет ошибку.Что касается вашей проблемы, вам на самом деле не нужен ModalName2.objects.get() набор запросов.Поскольку аргумент obj является экземпляром ModelName, вы можете просто сделать следующее:

def email_verified(self,obj):
    return obj.username.modelname2.email_verified

Обратите внимание, что вы можете получить доступ к OneToOneField в обратном направлении, используя имя модели в нижнем регистре modelname2.

Также, поскольку username атрибут, возвращающий User экземпляр, было бы лучше переименовать его в user:

class ModelName1(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

Также я рекомендую вам присоединиться к ModelName и ModelName1 в качестве одной модели и использовать одну OneToOneField вместо двух.

...