Nano Hash - криптовалюты, майнинг, программирование

Администратор Dango выдает пустое исключение при вызове метода __str__

Я разрабатываю веб-приложение с Django (2.2). У меня есть следующая модель профиля, расширяющая встроенную модель пользователя через отношение «один к одному».

class Profile(models.Model):
    class Meta:
        ordering = ['user__last_name']

    txt = models.CharField("TXT", max_length=5, null=True, blank=True, unique=True)
    user = models.OneToOneField(User, on_delete=models.PROTECT)
    colleague = models.ForeignKey('self', on_delete=models.PROTECT, null=True, blank=True)

    def __str__(self):
        """ Display of User with its full name"""
        return "%s %s" % (self.user.last_name.upper(), self.user.first_name.capitalize())

Метод __str__ хорошо работает в представлении списка администратора или в оболочке Django. Однако когда я пытаюсь получить доступ к форме администратора, возникает исключение, указывающее на метод __str__, но без каких-либо подробностей.

При удалении метода __str__ форма отображается корректно.

Вот модельадмин

class ProfileAdmin(admin.ModelAdmin):
    readonly_fields = ('get_last_name','get_first_name',)

    fieldsets = [
        ('User', 
         {'fields': ['get_last_name', 'get_first_name','txt', 'colleague']}),
    ]
    #Sélection des champs à afficher dans la vue liste
    list_display = ('__str__','get_poste','txt', 'colleague ')

    #Champ de recherche
    search_fields = ['user__first_name',
                     'user__last_name',
                     ]

    #calculate fields for list_display
    def get_last_name(self, obj):
        return obj.user.last_name
    def get_first_name(self, obj):
        return obj.user.first_name

    #Define description of fields for list_display
    get_last_name.short_description = 'Name'
    get_first_name.short_description = 'Firstname'

    #Enable sorting on calculated fields
    get_last_name.admin_order_field = 'user__last_name'
    get_first_name.admin_order_field = 'user__first_name'

Любые советы по решению этой проблемы будут оценены

17.11.2020

  • Вы имеете в виду, что при доступе к форме добавления профиля возникает исключение? 17.11.2020
  • Я отключил форму добавления. Я пытаюсь получить доступ к записи, чтобы изменить ее. Я не знаю, идентичны ли форма добавления и модификации. 17.11.2020
  • Вы даже не видите никакой трассировки исключений на терминале? 17.11.2020
  • Я получаю только это: Трассировка стека: › Файл C:\...\app\models.py, строка 108, в str › return %s %s % (self.user.last_name, self .user.first_name) А затем список загруженных модулей: 'app.models', 'django.db.models.base', 'pprint', 'debug_toolbar.panels.templates.panel', 'django.dispatch.dispatcher' , 'django.test.utils', 'django.template.base', 'django.template.backends.django', 'django.template.response', 'django.core.handlers.base', 'django.core. handlers.exception", "debug_toolbar.panels"... 17.11.2020
  • "%s %s" % (self.user.last_name, self.user.first_name) выдаст ошибку, если profile не связан с пользователем. Вы можете избежать этого, используя return "%s %s" % (self.user.last_name, self.user.first_name) if self.user is not None else "No user", или вы можете исправить любые профили с неработающими пользователями в вашей базе данных. 17.11.2020
  • Я уже протестировал if безуспешно, а также проверил, что ни один из моих профилей не сломан. У меня такое же исключение со всеми экземплярами моих профилей. 17.11.2020
  • Если if не работает, тогда отредактируйте свой вопрос, указав новый код и полную трассировку. Без этого мы не можем сказать, почему это не работает. 18.11.2020

Ответы:


1

Это потому, что у объекта еще нет first_name и last_name, поэтому вы вызываете null.upper() и null.capitalize(). Попробуйте обработать это внутри функции __str__ .

17.11.2020
  • Спасибо за ваш ответ. Объект User имеет эти 2 атрибута, и удаление методов upper/capitalize не позволяет избежать исключения 17.11.2020
  • В терминале я получаю только это: Stack trace: > File "C:\...\app\models.py", line 108, in str > return "%s %s" % (self.user.last_name, self.user.first_name) 17.11.2020
  • На самом деле теперь, когда я внимательно изучаю документы: docs.djangoproject.com/en/3.1/ref/contrib/admin/ я боюсь, что вы не можете использовать внутренние методы. Я бы попытался переименовать str в sth else, а затем вызвать это из str и формы. 17.11.2020
  • Я также проверил документ. На самом деле можно использовать __str__ в list_display, и это работает в модели профиля. Исключение возникает, когда я пытаюсь получить доступ к форме изменения. У меня есть другие модели с настроенными методами __str__, которые работают правильно, но метод Profile __str__ — единственный, который возвращает атрибуты внешнего ключа. 17.11.2020
  • Вы пытались установить pdb для метода __str__, чтобы увидеть, вызывает ли он правильный __str__? 17.11.2020

  • 2

    Наконец-то я решил проблему, добавив имя поля в модель профиля, автоматически обновив его с помощью пользовательского метода .save() и вернув его с помощью __str__ :

    class Profile(models.Model):
        class Meta:
            ordering = ['user__last_name']
    
        txt = models.CharField("TXT", max_length=5, null=True, blank=True, unique=True)
        user = models.OneToOneField(User, on_delete=models.PROTECT)
        name = models.CharField("Name", max_length=200, null=True, blank=True)
        colleague = models.ForeignKey('self', on_delete=models.PROTECT, null=True, blank=True)
    
        def save(self, *args, **kwargs):
            self.name = self.user.__str__()
            return super(Profile, self).save(*args, **kwargs)
    
        def __str__(self):
            """ Display of User with its full name"""
            return self.name
    

    Я также настроил метод User str в соответствии с Django: настроить поле возврата модели пользователя

    from django.contrib.auth.models import User
    
    def get_fullname(self):
        return "%s %s" % (self.last_name.upper(), self.first_name.capitalize())
    
    User.add_to_class("__str__", get_fullname)
    

    Спасибо что нашли время ответить

    18.11.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..