Bagaimana saya bisa mendapatkan URL penuh / absolut (misalnya https://example.com/some/path
) di Django tanpa modul Situs ? Itu konyol ... Saya tidak perlu meminta DB saya untuk mengambil URL!
Saya ingin menggunakannya reverse()
.
Bagaimana saya bisa mendapatkan URL penuh / absolut (misalnya https://example.com/some/path
) di Django tanpa modul Situs ? Itu konyol ... Saya tidak perlu meminta DB saya untuk mengambil URL!
Saya ingin menggunakannya reverse()
.
Jawaban:
Gunakan metode request.build_absolute_uri () yang berguna berdasarkan permintaan, berikan url relatifnya dan itu akan memberi Anda satu penuh.
Secara default, URL absolut untuk
request.get_full_path()
dikembalikan, tetapi Anda dapat memberikan URL relatif sebagai argumen pertama untuk mengubahnya menjadi URL absolut.sumber
{{ request.build_absolute_uri }}{{ object.get_absolute_url }}
- dan hei, url lengkap.{% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ object.get_absolute_url }}
karena{{ request.build_absolute_uri }}
memiliki garis miring dan{{ object.get_absolute_url }}
mulai dengan garis miring menghasilkan garis miring ganda di URL.Jika Anda ingin menggunakannya,
reverse()
Anda dapat melakukan ini:request.build_absolute_uri(reverse('view_name', args=(obj.pk, )))
sumber
url_name
bukannyaview_name
)def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
Anda juga dapat menggunakan
get_current_site
sebagai bagian dari aplikasi situs (from django.contrib.sites.models import get_current_site
). Dibutuhkan objek permintaan, dan default ke objek situs yang telah Anda konfigurasikanSITE_ID
di settings.py jika permintaanNone
. Baca lebih lanjut dalam dokumentasi untuk menggunakan kerangka kerja situsmisalnya
Ini tidak kompak / rapi
request.build_absolute_url()
, tetapi dapat digunakan ketika objek permintaan tidak tersedia, dan Anda memiliki url situs default.sumber
django.contrib.sites
di AndaINSTALLED_APPS
, itu tidak akan memukul DB sama sekali, dan memberikan informasi berdasarkan objek Request (lihat get_current_site )build_absolute_uri
masih terlihat seperti solusi yang lebih mudah dan bersih.Jika Anda tidak dapat mengakses
request
maka Anda tidak dapat menggunakanget_current_site(request)
seperti yang disarankan dalam beberapa solusi di sini. Anda dapat menggunakan kombinasi kerangka Situs asli danget_absolute_url
sebagai gantinya. Siapkan setidaknya satu Situs di admin, pastikan model Anda memiliki metode get_absolute_url () , lalu:https://docs.djangoproject.com/en/dev/ref/contrib/sites/#getting-the-current-domain-for-full-urls
sumber
request
keNone
atau panggilanget_current_site(None)
.Jika Anda tidak ingin membuka database, Anda bisa melakukannya dengan pengaturan. Kemudian, gunakan pengolah konteks untuk menambahkannya ke setiap templat:
sumber
Menurut Anda, lakukan saja ini:
sumber
django-fullurl
Jika Anda mencoba melakukan ini di templat Django, saya telah merilis paket PyPI kecil
django-fullurl
untuk memungkinkan Anda menggantiurl
danstatic
templat tag denganfullurl
danfullstatic
, seperti ini:Lencana-lencan ini semoga tetap diperbarui secara otomatis:
Dalam sebuah tampilan, Anda tentu saja dapat menggunakannya
request.build_absolute_uri
.sumber
request
objek untuk mendapatkan nama domain. Dalam hal ini, Anda harus menggunakansites
kerangka sebagai gantinya, yang mendapatkan nama domain dari database. Lihatdjango-absoluteuri
, disebutkan di bagian "lihat juga" dari README dari paket PyPI ini.Untuk membuat tautan lengkap ke halaman lain dari templat, Anda dapat menggunakan ini:
request.META.HTTP_HOST memberikan nama host, dan url memberikan nama relatif. Mesin templat kemudian menggabungkannya menjadi url lengkap.
sumber
http
dalam konteks ini) dan://
bagian dari URL, sehingga tidak akan memberikan url lengkap .Namun cara lain. Anda bisa menggunakannya
build_absolute_uri()
di dalamview.py
dan meneruskannya ke templat.view.py
your-template.html
sumber
HttpRequest.build_absolute_uri(request)
setara denganrequest.build_absolute_uri()
bukan?Periksa
Request.META
kamus yang masuk. Saya pikir itu memiliki nama server dan port server.sumber
Coba kode berikut:
sumber
Ini berfungsi untuk saya di templat saya:
Saya membutuhkan url lengkap untuk meneruskannya ke fungsi js fetch. Saya harap ini membantu Anda.
sumber
Saya tahu ini adalah pertanyaan lama. Tapi saya pikir orang masih sering mengalami hal ini.
Ada beberapa perpustakaan di luar sana yang melengkapi fungsi Django default. Saya sudah mencoba beberapa. Saya suka perpustakaan berikut ketika membalikkan referensi URL absolut:
https://github.com/fusionbox/django-absoluteuri
Satu lagi yang saya suka karena Anda dapat dengan mudah mengumpulkan domain, protokol, dan jalur:
https://github.com/RRMoelker/django-full-url
Pustaka ini memungkinkan Anda untuk menuliskan apa yang Anda inginkan di templat, misalnya:
sumber
Jika Anda menggunakan kerangka kerja Django REST, Anda dapat menggunakan fungsi sebaliknya dari
rest_framework.reverse
. Ini memiliki perilaku yang sama dengandjango.core.urlresolvers.reverse
, kecuali bahwa ia menggunakan parameter permintaan untuk membangun URL lengkap.Diedit untuk menyebutkan ketersediaan hanya dalam kerangka REST
sumber
request=request
. Itu juga tidak tampak seperti permintaan didokumentasikan di sini docs.djangoproject.com/en/1.9/ref/urlresolvers/#reverseSaya mendapatkannya:
Dapatkan uri lengkap dengan skema, host, jalur port, dan permintaan.
sumber
Ada juga ABSOLUTE_URL_OVERRIDES yang tersedia sebagai pengaturan
https://docs.djangoproject.com/en/2.1/ref/settings/#absolute-url-overrides
Tapi itu menimpa get_absolute_url (), yang mungkin tidak diinginkan.
Alih-alih menginstal kerangka situs hanya untuk ini atau melakukan beberapa hal lain yang disebutkan di sini yang bergantung pada objek permintaan, saya pikir solusi yang lebih baik adalah menempatkan ini di models.py
Tentukan BASE_URL di settings.py, lalu impor ke dalam models.py dan buat kelas abstrak (atau tambahkan ke yang sudah Anda gunakan) yang mendefinisikan get_truly_absolute_url (). Ini bisa sesederhana:
Subkelas dan sekarang Anda dapat menggunakannya di mana saja.
sumber
Seperti disebutkan dalam jawaban lain,
request.build_absolute_uri()
sangat cocok jika Anda memiliki akses kerequest
, dansites
kerangka kerjanya bagus selama URL yang berbeda menunjuk ke database yang berbeda.Namun, use case saya sedikit berbeda. Server pementasan saya dan server produksi mengakses database yang sama, tetapi
get_current_site
keduanya mengembalikan yang pertamasite
dalam database. Untuk mengatasi ini, Anda harus menggunakan semacam variabel lingkungan. Anda dapat menggunakan 1) variabel lingkungan (sepertios.environ.get('SITE_URL', 'localhost:8000')
) atau 2) berbedaSITE_ID
untuk server yang berbeda DAN pengaturan yang berbeda.py .Semoga seseorang akan menemukan ini berguna!
sumber
Saya menemukan utas ini karena saya ingin membangun URI absolut untuk halaman sukses.
request.build_absolute_uri()
memberi saya URI untuk tampilan saya saat ini tetapi untuk mendapatkan URI untuk tampilan kesuksesan saya, saya menggunakan yang berikut ....request.build_absolute_uri (membalikkan ('success_view_name'))
sumber
request.get_host()
akan memberi Anda domain.sumber
Anda juga bisa menggunakan:
Ini bekerja dengan baik untuk saya,
Saya tidak sepenuhnya yakin cara kerjanya. Saya percaya ini sedikit lebih rendah dan akan mengembalikan nama host server Anda, yang mungkin berbeda dari nama host yang digunakan oleh pengguna Anda untuk sampai ke halaman Anda.
sumber
Anda dapat mencoba "request.get_full_path ()"
sumber