这里有一些问题,我已经搜索了文档和 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
。我在这里做错了什么吗?我应该如何限制访问?我应该在我的模板中这样做吗?(我之前以两个用户的身份登录)
子问题:
reverse_lazy 在这里似乎不起作用,返回此错误:
Reverse for 'profile_update' with arguments '()' and keyword arguments '{}' not found.
我get_absolute_url
在我的模型中添加了一个,并从我的主项目的 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,再次保存对象时,会留下一些关于 url 和 userprofile 表中的 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/')
不是最优雅的解决方案,即使当前配置文件内部有值,用户也会检索一个空表单,并且如果提交,只会重定向到配置文件页面。