这里有一些问题,我搜索了文档和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
的用户个人资料。我在这里做错了什么吗?我该如何限制访问?我应该在我的模板中这样做吗? (我之前已经以两个用户身份登录)
子的问题:
reverse_lazy似乎无法在此处返回此错误:Reverse for 'profile_update' with arguments '()' and keyword arguments '{}' not found.
我在模型中添加了get_absolute_url
,并从主项目的网址中调用此urls.py。
对于创建配置文件的单独视图,在保存时阻止表单创建重复键的最佳做法是什么?
修改
根据@ 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/')
不是最优雅的解决方案,用户将检索空表单,即使当前配置文件中包含值,如果提交,也只会重定向到配置文件页面。
答案 0 :(得分:0)
广告0:不要在个人资料网址中使用ID,只需使用“/ profile”并从会话中获取经过身份验证的用户数据(request.user)
广告1:如果您有动态网址,则需要使用“get_success_url”,然后使用带有适当参数的反向
答案 1 :(得分:0)
您必须明确检查网址中的ID是否与登录用户的ID相同。缺少该检查,因此用户1能够看到用户2的个人资料。将其放在视图的开头。
您可以直接从django网址创建网址/个人资料/而不是反向匹配。
在创建新对象之前,请检查它是否已存在并更新它。