Saat ini, ketika sebuah instance muncul, situs default diatur ke example.com (untuk beberapa alasan).
Ubah itu atau tambahkan instruksi untuk mengubah id situs ke domain sebenarnya yang sedang digunakan.
Yang lebih buruk, jika saya menghapus example.com dari daftar situs saya mendapatkan 'Server error (500)' dan instalasi menjadi tidak dapat digunakan.
Inilah yang ada di log web tukang pos:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/postorius/views/list.py", line 593, in list_index
'domain_count': len(choosable_domains)})
File "/usr/local/lib/python2.7/site-packages/django/shortcuts.py", line 30, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/usr/local/lib/python2.7/site-packages/django/template/loader.py", line 68, in render_to_string
return template.render(context, request)
File "/usr/local/lib/python2.7/site-packages/django/template/backends/django.py", line 66, in render
return self.template.render(context)
File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 206, in render
with context.bind_template(self):
File "/usr/local/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/usr/local/lib/python2.7/site-packages/django/template/context.py", line 236, in bind_template
updates.update(processor(self.request))
File "/usr/local/lib/python2.7/site-packages/django_mailman3/context_processors.py", line 33, in common
context["site_name"] = get_current_site(request).name
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/shortcuts.py", line 15, in get_current_site
return Site.objects.get_current(request)
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 65, in get_current
return self._get_site_by_id(site_id)
File "/usr/local/lib/python2.7/site-packages/django/contrib/sites/models.py", line 35, in _get_site_by_id
site = self.get(pk=site_id)
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 385, in get
self.model._meta.object_name
DoesNotExist: Site matching query does not exist.
@ulrith Ya, Anda perlu mengubah default SITE_ID
dalam pengaturan Django ke situs apa pun yang Anda gunakan.
Secara default, nilainya adalah 1 di settings.py
container dan sesuai dengan example.com.
Anda harus mengubahnya menjadi 2, yang saya kira akan mengarah ke domain Anda di settings_local.py
. Anda dapat menambahkan yang berikut ini:
SITE_ID=2
@maxking Akan lebih baik jika saya dapat mengganti example.com dengan domain saya yang sebenarnya dengan beberapa perintah seperti yang saya sebutkan di komentar ini . Atau dengan permintaan sql dalam wadah basis data ... Bisakah Anda membantu?
@ulrith Ya, baris perintah Django akan menjatuhkan Anda ke REPL python di mana Anda dapat melakukan apa pun yang Anda inginkan, bahkan ke database produksi ;-)
maxking<strong i="7">@mailman</strong>:~$ docker exec -it mailman-web python manage.py shell
Python 2.7.13 (default, Jun 21 2017, 18:14:15)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.db import models
>>> from django.contrib.sites.models import Site
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>]>
>>> Site.objects.create(name='Random Domain', domain='mail.araj.me')
<Site: mail.araj.me>
>>> Site.objects.all()
<QuerySet [<Site: lists.araj.me>, <Site: mail.araj.me>]>
>>> for each in Site.objects.all():
... print(each.domain, each.id)
...
(u'lists.araj.me', 2)
(u'mail.araj.me', 3)
Jika Anda perlu membaca lebih lanjut tentang ini, berikut adalah tautan ke kerangka kerja Situs Django.
@maxking Sebenarnya saya tidak akrab dengan Python. Bisakah Anda memberi saya potongan kode (idealnya satu liner) yang akan menggantikan Site: example.com ke Site: mydomain.tld untuk Mailman 3 yang baru diinstal?
OK, jadi ternyata, Django membuat situs default examples.com
itu sendiri dan tidak ada cara untuk benar-benar menghentikan perilaku ini.
Jadi, inilah pilihan Anda jika Anda ingin membuat situs web baru saat startup.
python manage.py loaddata <nameoffixture>
dan django memuat data itu ke dalam database. Sebagai contoh:File di bawah ini disimpan ke fixtures/gen_site.yaml
:
- model: sites.Site
pk: 100
fields:
domain: gmail.com
name: Google
Kemudian, Anda menjalankan python manage.py loaddata gen_site
dan Situs Anda telah dibuat secara otomatis. Kemudian Anda mengubah SITE_ID=100
di settings_local.py
dan semuanya akan berfungsi!
Namun, melakukan ini sekarang dengan wadah mungkin sulit karena tidak ada cara mudah untuk benar-benar menjalankan perintah khusus saat startup (juga disebut entrypoint dalam terminologi Docker). Saya telah membuka edisi baru #61 untuk melacak masalah itu.
python manage.py shell -c "from django.contrib.sites.models import Site; mysite,_=Site.objects.get_or_create(id=101, name='mysite.tld', domain='mysite.tld'); print(mysite.id, mysite.name)"
Perhatikan bahwa perintah di atas dimaksudkan untuk Django, jadi Anda perlu menambahkan docker-compose exec -T mailman-web
sebelum perintah di atas.
Perintah ini akan membuat situs baru bernama mysite.tld
. Itu juga akan mencetak id
yang kemudian harus Anda letakkan di bawah SITE_ID=101
dan memulai ulang instans Django Anda agar ini berlaku. Perintah ini tidak akan gagal jika situs sudah ada di database.
Saya akan mengatakan ini juga bukan cara terbaik untuk melakukannya karena pertama, Anda perlu me-restart wadah agar ini berlaku (hanya pertama kali, tetapi itu sama buruknya) dan kedua, tidak ada cara untuk secara otomatis mengedit settings_local.py
untuk mencerminkan SITE_ID
tanpa intervensi manual, kecuali jika Anda menulis sihir sed
atau awk
.
example.com
dan memperbaruinya ke domain apa pun yang Anda inginkan.python manage.py shell -c "from django.contrib.sites.models import Site; Site.objects.filter(domain='example.com').update(name='My Site', domain='mysite.tld')"
Ini tidak memerlukan perubahan apapun dimanapun, tetapi dalam pengujian lokal saya, saya menemukan bahwa nama tampilan di atas tidak berubah kecuali saya me-restart server Django, dan itu hanya akan diperlukan untuk pertama kalinya. Menurut saya, ini terlihat seperti opsi terbaik, setelah yang pertama, yang ingin saya tambahkan dukungannya dalam gambar kontainer.
@maxking Opsi terakhir berfungsi seperti pesona! Terima kasih
Harus diselesaikan.
Variabel lingkungan DEFAULT_FROM_DOMAIN sekarang juga menggantikan domain default example.com.
Namun deskripsi tidak diubah dan dapat diubah dari situs admin Django.
Tetap di #95