如何添加一个按钮,将您重定向到 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 模式添加到 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
设置一个可点击的 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/
在我的例子中,我正在为 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 模式添加到 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
设置一个可点击的 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/