2

django cross-site reverseと同様の質問があります。しかし、同じ解決策を適用することはできないと思います。

ユーザーが独自のサイトを作成できるアプリを作成しています。サインアップ フォームを完了すると、ユーザーは自分のサイトの新しい投稿フォームにリダイレクトされます。この行に沿った何か:

        new_post_url = 'http://%s.domain:9292/manage/new_post %site.domain'
        logged_user = authenticate(username=user.username, password=user.password)
        if logged_user is not None:
            login(request, logged_user)
            return redirect(new_product_url)

さて、「new_post_url」がひどいもので赤ちゃんを泣かせることはわかっているので、何らかの方法で逆にする必要があります。これを解決するためにdjango.core.urlresolvers.reverseを使用することを考えましたが、ユーザーの新しく作成されたサイトではなく、ドメインの URL のみを返すため、うまくいきません。

それで、これを解決するためのより良い/よりスマートな方法を知っていますか?

4

2 に答える 2

1

ドメインはあなた自身のウェブサイトのサブドメインのように見えますが、その部分を元に戻すことができないことは何の問題ですか? これを使用すると、完全なドメイン パスは使用reverseされず、プロジェクトのルートからのパスが得られるため、次のように簡単に実行できます。

new_post_uri = 'http://%s.domain:9292%s' % (site.domain, reverse('manage_new_post'))

この方法では、まだリバースを使用しているため、URL をハードコーディングすることはなく (赤ちゃんを泣かせることもありません)、私が見る限り実際には問題はありません。

最後に、コードに独自のドメインをハードコーディングしたくない場合は、Django のSitesモデルを使用して現在のサイトを取得し、デフォルトの example.com から独自のドメインに変更してください。最終的にコードは次のようになります。

current_site = Site.objects.get_current() # See the docs for other options
return redirect('http://%s.%s%s' % (site.domain, current_site, reverse('manage_new_post')))

Sites オブジェクトを使用せずにドメインを取得する必要がある場合、最善の策はrequest.get_host()である可能性があります。これは完全なドメインとポートを取得しますが、プロトコルは取得しません。

うまくいけば、それはあなたのために物事を説明します. もう少しうまくフォーマットできますが、それが要点です。

于 2010-04-06T23:08:01.627 に答える
0

redirectまた、必要に応じてビュー名を引数として取ります。したがって、必要なすべての変数が既にあるので、複雑な逆を試すのではなく、必要なすべての引数をビュー名に渡すだけで完了です!

それでも逆の性質が必要な場合は、サイトのモデルで get_absolute_url を使用する必要があります。

于 2010-04-07T08:05:49.223 に答える