1

ここでいくつかの問題があり、ドキュメントと SO を検索して、さらに混乱するようにしました。

主な問題:

私はviews.pyにロードするUserProfileFormを持っています:

from braces.views import LoginRequiredMixin, CsrfExemptMixin

class UpdateUserProfileView(LoginRequiredMixin, CsrfExemptMixin, UpdateView):
    model = UserProfile
    success_url = reverse_lazy('profile_update')
    form_class = UserProfileForm

そして私のurls.pyで:

urlpatterns = patterns('',
    url(r'^(?P<pk>\d+)/$', UpdateUserProfileView.as_view(), name='profile_update'),
)

としてログインするとuser_id 2、自分のプロファイル/profile/2/が に表示されますが、 キーを/profile/1/入力すると、 のユーザー プロファイルを編集できますuser_id 1。ここで私が間違っていることはありますか?アクセスを制限するにはどうすればよいですか? 代わりにテンプレートで行う必要がありますか? (私は以前に両方のユーザーとしてログインしました)

サブ問題:

  1. ここで reverse_lazy が機能しないようで、このエラーが返されます:モデルにReverse for 'profile_update' with arguments '()' and keyword arguments '{}' not found.a を追加get_absolute_urlし、メイン プロジェクトの URL からこの urls.py を呼び出しています。

  2. プロファイルを作成するための別のビューについて、保存時にフォームが重複キーを作成しないようにするためのベスト プラクティスは何ですか?

編集:

@mariodev の提案に基づいて、urls.py を書き直しました。

urlpatterns = patterns('',
    url(r'^create/$', CreateUserProfileView.as_view(), name='profile_create'),
    url(r'^view/$', UpdateUserProfileView.as_view(), name='profile_update'),
)

views.py に、新しいクラスを追加しました。

class GetProfileMixin(object):
    def get_object(self):
        profile = get_object_or_404(UserProfile, user=self.request.user)

        if profile.user != self.request.user:
            raise Http404
        return profile

そして、以下を使用して UpdateUserProfileFormView を呼び出します。

class UpdateUserProfileView(LoginRequiredMixin, GetProfileMixin, UpdateView):
     model = UserProfile
     form_class = UserProfileForm

createview に再度アクセスすると、オブジェクトを再度保存するときに、userprofile テーブル内の URL とforeign_key の重複に関するいくつかの小さな問題が残りました。これはよくある問題だと思いますが、明らかな答えを見逃しています。

編集2:

以下を変更しました。

def form_valid(self, form):
    try:
        created = UserProfile.objects.get(user=self.request.user)
    except UserProfile.DoesNotExist:
        profile = form.save(commit=False)
        profile.user = self.request.user
        profile.save()
        return super(CreateUserProfileView, self).form_valid(form)
    return HttpResponseRedirect('/accounts/profile/')

最も洗練されたソリューションではありません。現在のプロファイルに値が含まれている場合でも、ユーザーは空のフォームを取得し、送信された場合はプロファイル ページにリダイレクトするだけです。

4

2 に答える 2

0

広告 0: プロファイル URL で ID を使用しないでください。「/profile」を使用して、セッション (request.user) から認証済みユーザー データを取得してください。

広告 1: 動的 URL がある場合は、「get_success_url」を使用してから、適切な引数を指定して逆方向を使用する必要があります

于 2013-07-03T14:14:51.080 に答える
0
  1. アクセスを制限する方法:

URL に含まれる ID がログインしているユーザーの ID と同じであることを明示的に確認する必要があります。そのチェックが欠落しているため、ユーザー 1 はユーザー 2 のプロファイルを表示できます。これをビューの先頭に配置します。

  1. reverse_lazy が機能しない:

django の URL から逆マッチングする代わりに、URL /profile/ を直接作成できます。

  1. 保存時にフォームが重複キーを作成しないようにするためのベスト プラクティスは何ですか?

新しいオブジェクトを作成する前に、それがすでに存在するかどうかを確認して更新します。

于 2013-07-03T14:42:31.020 に答える