#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')]
ТОГДА это должно сработать. еще раз извините!