Как добавить кнопку, которая перенаправляет вас на страницу администратора html django

#django #django-admin

#django #django-администратор

Вопрос:

В моем случае я создавал шаблон для PDF-файла, который я хотел, чтобы его можно было просматривать непосредственно со страницы администратора, где был создан шаблон, чтобы люди могли видеть, каким будет результат объекта, который они только что создали. Мне действительно просто нужна была одна ссылка с представлением, которая показывала бы для меня PDF, но даже что-то базовое не сразу очевидно в Django admin. Я TransactionModel зарегистрирован на admin странице, как показано ниже :

 @ admin.register(Transaction)
class TransactionAdmin(admin.ModelAdmin):
   search_fields = ['chp_reference', 'familymember__name']
   inlines = [FamilyGroupInline, FamilyMemberInline]

   def report(self, obj):
       return mark_safe(json2html.convert(json=obj.report, table_attributes="class="results" 
         style="overflow-x:auto;""))

   fieldsets = (
       ('Transaction Details', {
           'fields': ('chp_reference', 'income_period', 'property_market_rent', 
      'rent_effective_date', 'number_of_family_group',),
    }),
    ('Report', {
        'classes': ('collapse',),
        'fields': ('report',),
     }),
   )
    readonly_fields = ['report', 'complete', 'last_rent']
 

я хочу Report , чтобы объект из fieldsets был интерактивной ссылкой, которая перенаправляет пользователя на HTML-файл, я не знаю, возможно ли это .. и если это так, каков наилучший подход для этого, спасибо!

Вот трассировка ошибки

     Traceback (most recent call last):
    File "C:UserseT3AppDataLocalProgramsPythonPython37- 
    32libthreading.py", line 926, in _bootstrap_inner
    self.run()
    File "C:UserseT3AppDataLocalProgramsPythonPython37- 
    32libthreading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
    File "E:15-12venvlibsite-packagesdjangoutilsautoreload.py", line 53, 
    in wrapper
    fn(*args, **kwargs)
    File "E:15-12venvlibsite- 
    packagesdjangocoremanagementcommandsrunserver.py", line 117, in 

inner_run
    self.check(display_num_errors=True)
  File "E:15-12venvlibsite-packagesdjangocoremanagementbase.py", line 395, in check
    include_deployment_checks=include_deployment_checks,
  File "E:15-12venvlibsite-packagesdjangocoremanagementbase.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "E:15-12venvlibsite-packagesdjangocorechecksregistry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "E:15-12venvlibsite-packagesdjangocorechecksurls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "E:15-12venvlibsite-packagesdjangocorechecksurls.py", line 23, in check_resolver
    return check_method()
  File "E:15-12venvlibsite-packagesdjangourlsresolvers.py", line 407, in check
    for pattern in self.url_patterns:
  File "E:15-12venvlibsite-packagesdjangoutilsfunctional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "E:15-12venvlibsite-packagesdjangourlsresolvers.py", line 588, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "E:15-12venvlibsite-packagesdjangoutilsfunctional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "E:15-12venvlibsite-packagesdjangourlsresolvers.py", line 581, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:UserseT3AppDataLocalProgramsPythonPython37-32libimportlib__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "E:15-12cra-calculator-masterprojecturls.py", line 45, in <module>
    path('', admin.site.urls),
  File "E:15-12venvlibsite-packagesdjangoutilsfunctional.py", line 225, in inner
    return func(self._wrapped, *args)
  File "E:15-12venvlibsite-packagesdjangocontribadminsites.py", line 293, in urls
    return self.get_urls(), 'admin', self.name
  File "E:15-12venvlibsite-packagesdjangocontribadminsites.py", line 277, in get_urls
    path('%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
  File "E:15-12venvlibsite-packagesdjangocontribadminoptions.py", line 628, in urls
    return self.get_urls()
  File "E:15-12cra-calculator-masterappadmin.py", line 145, in get_urls
    urls  = pattern
TypeError: 'URLPattern' object is not iterable
 

вот мой preview_pdf_view()

 def preview_pdf_view(self, request, **kwargs):
    tx = Transaction.objects.get(id=kwargs['id'])
    context = {'tx': tx}
    return TemplateResponse(request, 'admin/preview_pdf.html', context=context)
 

get_url()

 def get_urls(self):
    urls = super().get_urls()
    pattern = path('preview/<int:id>/', self.admin_site.admin_view(self.preview_pdf_view), name='preview-pdf')
    urls  = pattern
    return urls
 

и в models.py я добавил preview_link()

 @property
    def preview_link(self):
        a = '''<a href=" url 'preview-pdf' id={} , name={}"</a>'''.format(self.id, self.chp_reference)
        return mark_safe(a)
 

Ответ №1:

Вы можете добавить небольшое пользовательское представление в свой TransactionAdmin :

 class TransactionAdmin(admin.ModelAdmin):

    def preview_pdf_view(self, request, **kwargs):
        tx = Transaction.objects.get(id=kwargs['id'])
        context = {'tx': tx}
        return TemplateResponse(request, 'admin/preview_pdf.html', context=context)
 

Обязательно создайте шаблон preview_pdf.html . Здесь используйте контекст для отображения вашего PDF-файла с tx.image.url помощью или как у вас есть эта настройка.

Чтобы сделать представление доступным, добавьте шаблон url TransactionAdmin get_urls в метод:

     def get_urls(self):
        urls = super().get_urls()
        pattern = path('preview/<int:id>/', self.admin_site.admin_view(self.preview_pdf_view), name='preview-pdf')
        urls  = pattern
        return urls
 

Затем у вас может быть интерактивная ссылка для каждого Transaction в представлении списка администраторов. Я бы сделал это на уровне модели:

 from django.utils.html import mark_safe

class Transaction(models.Model):

    @property
    def preview_link(self):
        a = '''<a href="{% url 'preview-pdf' id={} %}">{}</a>'''.format(self.id, self.name)
        return mark_safe(a)
    
 

Вы можете использовать ее в list_display или где-либо еще как transaction.preview_link :

 class TransactionAdmin(admin.modelAdmin):
    list_display = ('preview_link', )
 

Подробнее см. В разделе Добавление представлений на сайты администратора https://docs.djangoproject.com/en/3.1/ref/contrib/admin /

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

1. спасибо за ответ, но я получаю сообщение об ошибке TypeError: 'URLPattern' object is not iterable при добавлении get_url() функции

2. Извините, у меня была опечатка в предпоследнем блоке кода, которая, как я думаю, может быть причиной этого. Смотрите Мое редактирование метода preview_link модели. Но также поделитесь большей частью трассировки с вашего терминала, чтобы я мог узнать больше об ошибке.

3. Я добавил трассировку к исходному сообщению, пожалуйста, проверьте

4. хм, как выглядит ваш get_urls метод? Можете ли вы поделиться этим? Просто хочу убедиться, что она похожа на мою.

5. @AbdullaOsama черт возьми, я не прав в этом get_urls , установите pattern список шаблонов URL, а не просто шаблон url. patterns = [path('preview/<int:id>/', self.admin_site.admin_view(self.preview_pdf_view), name='preview-pdf')] ТОГДА это должно сработать. еще раз извините!