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

Django Admin вложенный встроенный

Мне нужен встроенный встроенный администратор django, который я могу включить встроенным полем даты в другой встроенный файл, как показано ниже.

У меня есть модели ниже:

class Person(models.Model):
     name = models.CharField(max_length=200)
     id_no = models.IntegerField()

class Certificate(models.Model):
     cerfificate_no = models.CharField(max_length=200)
     certificate_date = models.DateField(max_length=100)
     person = models.ForeignKey(Person)
     training = models.CharField(max_length=200)

class Training_Date(models.Model):
      date = models.DateField()
      certificate = models.ForeignKey(Certificate)

и админ ниже:

class CertificateInline(admin.StackedInline):
    model = Certificate

class PersonAdmin(admin.ModelAdmin):
     inlines = [CertificateInline,]
admin.site.register(Person,PersonAdmin)

но мне нужно включить модель Training_Date как встроенную, которая является частью встроенного администратора сертификата.

Любая идея ?


Ответы:


1

AFAIK, у вас не может быть второго уровня встроенных строк в администраторе Django по умолчанию.

Администратор Django - это обычное приложение Django, поэтому ничто не мешает вам реализовать второй уровень вложенных форм, но IMHO это было бы своего рода запутанным дизайном для реализации. Возможно, поэтому и нет.

13.01.2013
  • Я столкнулся с похожим сценарием. Думаю, я просто переопределю встроенный шаблон и добавлю несколько ссылок на второй уровень. 06.04.2017

  • 2

    В последнее время произошли некоторые подвижки в https://code.djangoproject.com/ticket/9025 , но я бы не задерживал дыхание.

    Один из распространенных способов обойти это - связать с администратором между первым и вторым (или вторым и третьим) уровнями, имея как ModelAdmin, так и Inline для одной и той же модели:

    Дайте Certificate ModelAdmin с TrainingDate в качестве встроенного. Добавьте CertificateInline дополнительное поле Подробности, которое является ссылкой на форму ModelAdmin изменения.

    models.py:

    from django.core import urlresolvers
    
    class Certificate(models.Model):
        
        # ...
        
        def changeform_link(self):
            if self.id:
                # Replace "myapp" with the name of the app containing
                # your Certificate model:
                changeform_url = urlresolvers.reverse(
                    'admin:myapp_certificate_change', args=(self.id,)
                )
                return u'<a href="%s" target="_blank">Details</a>' % changeform_url
            return u''
        changeform_link.allow_tags = True
        changeform_link.short_description = ''   # omit column header
    

    admin.py:

    # Certificate change form has training dates as inline
    
    class TrainingDateInline(admin.StackedInline):
        model = TrainingDate
    
    class CertificateAdmin(admin.ModelAdmin):
        inlines = [TrainingDateInline,]
    admin.site.register(Certificate ,CertificateAdmin)
    
    # Person has Certificates inline but rather
    # than nesting inlines (not possible), shows a link to
    # its own ModelAdmin's change form, for accessing TrainingDates:
    
    class CertificateLinkInline(admin.TabularInline):
        model = Certificate
        # Whichever fields you want: (I usually use only a couple
        # needed to identify the entry)
        fields = ('cerfificate_no', 'certificate_date', 'changeform_link')
        readonly_fields = ('changeform_link', )
    
    class PersonAdmin(admin.ModelAdmin):
        inlines = [CertificateLinkInline,]
    admin.site.register(Person, PersonAdmin)
    
    14.01.2013
  • Это хорошее решение. Я хочу отметить, что вы можете поместить changeform_link в CertificateLinkInline. Это могло бы быть лучшим местом, потому что оно специфично для django-admin. Обратите внимание, что при этом вы должны использовать instance.id вместо self.id, чтобы перейти к экземпляру модели. См. docs.djangoproject.com/ ru / dev / ref / contrib / admin / 16.06.2013
  • Если метод changeform_link вызывает исключение, django съест его и продолжит, оставив поле пустым. Мне так и не удалось найти, куда django помещает трассировку и делает ли он что-нибудь вообще. Я предлагаю обернуть его в try /, за исключением того, чтобы убедиться, что исключение где-то регистрируется. Для упрощения может быть полезно создать декоратор, обрабатывающий все это. 14.03.2014
  • Похоже, что в Django 2+ вы можете просто добавить show_change_link = True в свой класс admin.TabularInline, и я думаю, если у вас есть обычный admin.ModelAdmin для него, он будет показывать ссылку «изменить» во встроенной строке. 03.04.2020

  • 3

    Более универсальное решение

    from django.utils.safestring import mark_safe
    from django.urls import reverse
    
    class EditLinkToInlineObject(object):
        def edit_link(self, instance):
            url = reverse('admin:%s_%s_change' % (
                instance._meta.app_label,  instance._meta.model_name),  args=[instance.pk] )
            if instance.pk:
                return mark_safe(u'<a href="{u}">edit</a>'.format(u=url))
            else:
                return ''
    
    class MyModelInline(EditLinkToInlineObject, admin.TabularInline):
        model = MyModel
        readonly_fields = ('edit_link', )
    
    class MySecondModelAdmin(admin.ModelAdmin):
        inlines = (MyModelInline, )
    
    admin.site.register(MyModel)
    admin.site.register(MySecondModel, MySecondModelAdmin)
    
    01.03.2014
  • Просто и гибко. +1 16.05.2017
  • Очень похожее решение более подробно описано в этой статье: djangotricks.blogspot.com/2016/12/ 18.06.2020

  • 4
    pip install django-nested-inline
    

    Этот пакет должен делать то, что вам нужно.

    26.10.2014
  • django-nested-inline (пока?) не поддерживается в последних выпусках django. Но вы можете рассмотреть возможность использования github.com/theatlantic/django-nested-admin, который почти то же самое. 15.04.2016
  • @vmonteco не могли бы вы дать мне ссылку на документ, где описано, как его использовать без пакетов? 26.01.2017
  • @OleksandrDashkov django-nested-admin.readthedocs.io/en/latest , вверху страницы github. Но, вероятно, все равно придется установить пакет. 26.01.2017
  • Предупреждение: я начал использовать django-nested-inline и столкнулся с множеством ошибок, на выяснение которых уходит много времени. Вы можете оценить другие варианты, прежде чем решить, какой модуль использовать. 30.04.2020
  • @pspahn нашли ли вы разумную альтернативу этому 01.07.2021

  • 5

    Вложенные встроенные строки доступны по адресу: https://github.com/BertrandBordage/django-super-inlines/

    pip install django-super-inlines
    
    15.05.2015
  • Я пробовал. Это не позволяет мне добавлять или удалять некоторые встроенные строки и заставляет меня создавать 3 новых дочерних объекта. На данном этапе разработки его нельзя использовать. 04.07.2016

  • 6

    Я использовал решение, предоставленное @bigzbig (спасибо).

    Я также хотел вернуться на первую страницу списка после сохранения изменений, поэтому добавил:

    class MyModelInline(EditLinkToInlineObject, admin.TabularInline):
        model = MyModel
        readonly_fields = ('edit_link', )
    
        def response_post_save_change(self, request, obj):
            my_second_model_id = MyModel.objects.get(pk=obj.pk).my_second_model_id
            return redirect("/admin/mysite/mysecondmodel/%s/change/" % (my_second_model_id))
    
    27.01.2018
  • Спасибо за фрагмент! Я просто хотел добавить, что это сработало для меня только после включения функции post_save_change в MyModelAdmin. 09.04.2018

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

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

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

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

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

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

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

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