Dans mon cas, je créais un modèle pour un PDF que je voulais pouvoir prévisualiser directement à partir de la page d'administration où le modèle a été créé, afin que les gens puissent voir quel serait le résultat de l'objet qu'ils venaient de créer. J'avais vraiment besoin d'un seul lien avec une vue qui afficherait un PDF pour moi, mais même quelque chose de basique n'est pas immédiatement évident dans l'administration Django. J'ai un TransactionModel
enregistré dans la admin
page comme ci-dessous:
@ 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']
Je veux que l' Report
objet du fieldsets
soit un lien cliquable qui redirige l'utilisateur vers un fichier html, je ne sais pas si c'est possible... et si c'est, quelle est la meilleure approche pour le faire, merci !
Voici une trace de l'erreur
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:\15-12\venv\lib\site-packages\django\utils\autoreload.py", line 53,
in wrapper
fn(*args, **kwargs)
File "E:\15-12\venv\lib\site-
packages\django\core\management\commands\runserver.py", line 117, in
inner_run
self.check(display_num_errors=True)
File "E:\15-12\venv\lib\site-packages\django\core\management\base.py", line 395, in check
include_deployment_checks=include_deployment_checks,
File "E:\15-12\venv\lib\site-packages\django\core\management\base.py", line 382, in _run_checks
return checks.run_checks(**kwargs)
File "E:\15-12\venv\lib\site-packages\django\core\checks\registry.py", line 72, in run_checks
new_errors = check(app_configs=app_configs)
File "E:\15-12\venv\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
return check_resolver(resolver)
File "E:\15-12\venv\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
return check_method()
File "E:\15-12\venv\lib\site-packages\django\urls\resolvers.py", line 407, in check
for pattern in self.url_patterns:
File "E:\15-12\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "E:\15-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:\15-12\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "E:\15-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:\15-12\cra-calculator-master\project\urls.py", line 45, in <module>
path('', admin.site.urls),
File "E:\15-12\venv\lib\site-packages\django\utils\functional.py", line 225, in inner
return func(self._wrapped, *args)
File "E:\15-12\venv\lib\site-packages\django\contrib\admin\sites.py", line 293, in urls
return self.get_urls(), 'admin', self.name
File "E:\15-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:\15-12\venv\lib\site-packages\django\contrib\admin\options.py", line 628, in urls
return self.get_urls()
File "E:\15-12\cra-calculator-master\app\admin.py", line 145, in get_urls
urls += pattern
TypeError: 'URLPattern' object is not iterable
Voici mon 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
et dans le models.py
j'ai ajouté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)
Vous pouvez ajouter une petite vue personnalisée dans votre 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)
Assurez-vous de créer le modèle preview_pdf.html
. Ici, utilisez le contexte pour rendre votre PDF avec tx.image.url
ou comme vous avez cette configuration.
Pour rendre la vue accessible, ajoutez le modèle d'url à TransactionAdmin
la get_urls
méthode :
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
Ensuite, vous pouvez avoir un lien cliquable pour chacun Transaction
dans la vue de la liste des administrateurs. Je ferais cela au niveau du modèle:
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)
Vous pouvez l'utiliser dans list_display
, ou n'importe où ailleurs comme transaction.preview_link
:
class TransactionAdmin(admin.modelAdmin):
list_display = ('preview_link', )
En savoir plus sur Ajout de vues aux sites d'administration https://docs.djangoproject.com/en/3.1/ref/contrib/admin/
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots