用户访问其他用户'形式使用django-braces

时间:2013-07-03 12:44:28

标签: django django-views django-urls

这里有一些问题,我搜索了文档和SO只是为了让人更加困惑。

主要问题:

我有一个UserProfileForm,我加载到views.py:

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.我在模型中添加了get_absolute_url,并从主项目的网址中调用此urls.py。

  2. 对于创建配置文件的单独视图,在保存时阻止表单创建重复键的最佳做法是什么?

  3. 修改

    根据@ 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/')
    

    不是最优雅的解决方案,用户将检索空表单,即使当前配置文件中包含值,如果提交,也只会重定向到配置文件页面。

2 个答案:

答案 0 :(得分:0)

广告0:不要在个人资料网址中使用ID,只需使用“/ profile”并从会话中获取经过身份验证的用户数据(request.user)

广告1:如果您有动态网址,则需要使用“get_success_url”,然后使用带有适当参数的反向

答案 1 :(得分:0)

  1. 如何限制访问:
  2. 您必须明确检查网址中的ID是否与登录用户的ID相同。缺少该检查,因此用户1能够看到用户2的个人资料。将其放在视图的开头。

    1. reverse_lazy不工作:
    2. 您可以直接从django网址创建网址/个人资料/而不是反向匹配。

      1. 在保存
      2. 时阻止表单创建重复键的最佳做法是什么

        在创建新对象之前,请检查它是否已存在并更新它。