21

以下のようなモデルがあります。インスタンスが作成されたら、関係者に電子メールを送信したい:

class TrainStop(models.Model):
    name = models.CharField(max_length=32)
    notify_email = models.EmailField(null=True, blank=True)

def new_stop_created(sender, instance, created, *args, **kwargs):

    # Only for new stops
    if not created or instance.id is None: return

    # Send the status link
    if instance.notify_email:
        send_mail(
            subject='Stop submitted: %s' % instance.name,
            message='Check status: %s' % reverse('stop_status', kwargs={'status_id':str(instance.id),}),
            from_email='admin@example.com',
            recipient_list=[instance.notify_email,]
        )
signals.post_save.connect(new_stop_created, sender=TrainStop)

ただし、reverse呼び出しは URL のパス部分のみを返します。例: /stops/9/status/. のような完全な URL が必要ですhttp://example.com/stops/9/status/。現在の Web サイトのホスト名とポート (ポート 80 を使用しないテスト インスタンスの場合) を取得するにはどうすればよいですか?

settings.py私の最初の考えは、必要に応じてアクセスできるように、変数を介してこれを利用できるようにすることでした。ただし、誰かがより強力な提案をするかもしれないと考えました。

4

2 に答える 2

5

yedpodtrzitko が述べたように、sites フレームワークがありますが、あなたが述べたように、それは非常に手動のセットアップです。

settings.py での設定が必要ですが、サイトの設定よりもわずかに手間がかかります。SITE_ID(サイトと設定ができるのと同じように、複数のドメインを処理できます)。

get_absolute_urlを置き換えるアイデアがあります。これにより、このようなことが簡単になりますが、その実装には同じ問題 (ドメインの取得方法、スキーム [http vs https] など) があると思います。

私は、着信リクエストを調べて、HTTP HOST ヘッダーの値の頻度に基づいて、ある種の「最も可能性の高いドメイン」設定を構築するミドルウェアのアイデアをいじっています。または、この設定をリクエストごとに個別に設定して、常に現在のドメインを操作できるようにすることもできます。真剣に検討するまでには至りませんでしたが、考え中です。

于 2010-11-11T02:05:01.737 に答える
4

現在のサイトを取得するには、オブジェクト Site:

request オブジェクトにアクセスできない場合は、Site モデルのマネージャーの get_current() メソッドを使用できます。次に、設定ファイルに SITE_ID 設定が含まれていることを確認する必要があります。この例は、前の例と同等です。

from django.contrib.sites.models import Site

def my_function_without_request():
    current_site = Site.objects.get_current()
    if current_site.domain == 'foo.com':
        # Do something
        pass
    else:
        # Do something else.
        pass

詳細: http://docs.djangoproject.com/en/dev/ref/contrib/sites/

于 2010-11-11T00:01:15.937 に答える