-1

ユーザー登録フローが壊れています。に以下のコードがありますがviews.py、user.url 属性がないというエラーが表示されます (views コードの下に含まれています)。ユーザーは適切に作成され、新しいユーザー プロファイル ページに移動できますが、リンクが壊れています。デフォルトのユーザー URL 呼び出しに関する情報が見つかりません。

手伝ってくれますか?

ビュー.py

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            new_user = authenticate(username = request.POST['username'],
                                    password = request.POST['password1'])
            login(request, new_user)
            return HttpResponseRedirect(new_user.url)
    else:
        form = UserCreationForm()
    return render_to_response("registration/register.html", {'form': form},
                              context_instance=RequestContext(request))

エラー:

AttributeError at /register/
'User' object has no attribute 'url'
Request Method: POST
Request URL:    http://localhost:8000/register/
Django Version: 1.4.1
Exception Type: AttributeError
Exception Value:    
'User' object has no attribute 'url'
Exception Location: /home/methuselah/code/django/ssc/dev/ssc/crewcal/views.py in register, line 74
4

2 に答える 2

2

ユーザーの URLを本当に定義したいが、新しいモデルを作成せずにユーザーを使用し続ける場合django.contrib.authは、次のエントリを に追加する必要がありますsettings.ABSOLUTE_URL_OVERRIDES

ABSOLUTE_URL_OVERRIDES = {
    'auth.user': lambda u: '/users/%s/' % u.id
}

これを行うと、ユーザーがサインアップした後にuser.get_absolute_url()リダイレクトするために使用できるようになります。/users/<id>/

ただし、追加のプロファイルを追加したい場合Userは、プロファイル モデルを作成する必要があります。この時点で、Userの get_absolute_url をオーバーライドするのではなく、そこにリンクするのが理にかなっています。ユーザー用の Profile モデルがある場合は、 Nick の回答が適切に機能します。

于 2012-08-17T16:01:43.607 に答える
1

ユーザー オブジェクトに URL がありません。すべてのユーザーに URL を設定したい場合は、ユーザー モデルとの関係を持つ追加のモデルを作成する必要があります。

class UserAttribute(models.Model):
    user = models.OneToOneField(User)
    url = models.URLField(verify_exists=False, default="/home/page/")

    def __unicode__(self):
        return self.user.username

ユーザーがログインすると、すべてのリクエストでユーザーを取得できるため、すべてのユーザーに一意の URL を設定する理由がわかりませんrequest.user

したがって、おそらくやりたいことは次のとおりです。

return redirect('/profile/')

プロファイルの表示を処理する別のビューを作成します。あなたが達成しようとしていることについての情報がなければ、答えるのは難しいです。

于 2012-08-17T15:32:38.560 に答える