如何添加一个按钮,将您重定向到 html 页面 django 管理页面

How to add a button that redirects you to html page django admin page

在我的例子中,我正在为 PDF 创建一个模板,我想直接从创建模板的管理页面预览它,这样人们就可以看到他们的对象的结果d 刚刚创建。 我真的只需要一个 link 和一个可以为我显示 PDF 的视图,但即使是基本的东西在 Django 管理中也不是很明显。我在 admin 页面中注册了一个 TransactionModel,如下所示:

@ 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']

我希望 fieldsets 中的 Report 对象成为可点击的 link 对象,将用户重定向到 html 文件,我不知道这是否可行。 . 如果是,最好的方法是什么,谢谢!

这是错误的回溯

    Traceback (most recent call last):
    File "C:\Users\eT3\AppData\Local\Programs\Python\Python37- 
    32\lib\threading.py", line 926, in _bootstrap_inner
    self.run()
    File "C:\Users\eT3\AppData\Local\Programs\Python\Python37- 
    32\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
    File "E:-12\venv\lib\site-packages\django\utils\autoreload.py", line 53, 
    in wrapper
    fn(*args, **kwargs)
    File "E:-12\venv\lib\site- 
    packages\django\core\management\commands\runserver.py", line 117, in 

inner_run
    self.check(display_num_errors=True)
  File "E:-12\venv\lib\site-packages\django\core\management\base.py", line 395, in check
    include_deployment_checks=include_deployment_checks,
  File "E:-12\venv\lib\site-packages\django\core\management\base.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "E:-12\venv\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "E:-12\venv\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "E:-12\venv\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "E:-12\venv\lib\site-packages\django\urls\resolvers.py", line 407, in check
    for pattern in self.url_patterns:
  File "E:-12\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "E:-12\venv\lib\site-packages\django\urls\resolvers.py", line 588, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "E:-12\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "E:-12\venv\lib\site-packages\django\urls\resolvers.py", line 581, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:\Users\eT3\AppData\Local\Programs\Python\Python37-32\lib\importlib\__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:-12\cra-calculator-master\project\urls.py", line 45, in <module>
    path('', admin.site.urls),
  File "E:-12\venv\lib\site-packages\django\utils\functional.py", line 225, in inner
    return func(self._wrapped, *args)
  File "E:-12\venv\lib\site-packages\django\contrib\admin\sites.py", line 293, in urls
    return self.get_urls(), 'admin', self.name
  File "E:-12\venv\lib\site-packages\django\contrib\admin\sites.py", line 277, in get_urls
    path('%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
  File "E:-12\venv\lib\site-packages\django\contrib\admin\options.py", line 628, in urls
    return self.get_urls()
  File "E:-12\cra-calculator-master\app\admin.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)

您可以在 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。在这里,使用上下文通过 tx.image.url 呈现您的 PDF,或者您有该设置。

要使视图可访问,请将 url 模式添加到 TransactionAdminget_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 设置一个可点击的 link。我会在模型级别执行此操作:

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/