2013-07-03 40 views
1

的幾個問題,我已經通過文檔檢索,這樣做只是爲了獲得更多的困惑。用戶訪問其他用戶的表單使用這裏的Django拉條

主要問題:

我有我加載到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.我已經在我的模型增加了get_absolute_url,並調用這個網址.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/') 

不是最優雅的解決方案,用戶將獲取即使目前的個人資料中,如果提交值的空形式,只會重定向到個人資料頁面。

+0

是否要限制訪問其他用戶的個人資料頁面,或者只想禁用編輯。 – Sudipta

+0

想限制訪問其他用戶的配置文件。 – mrkre

回答

0

廣告0:不要在你的個人資料網址使用的ID,只需使用「/ profile文件」,並從會話(請求獲取認證的用戶的數據。用戶)

廣告1:如果您有動態的URL,你需要使用「get_success_url」,然後使用適當的參數

+0

好主意。更改我的網址如下所示: 'url(r'^ create/$',CreateUserProfileView.as_view(),name ='profile_create'),' 'url(r'^ view/$',UpdateUserProfileView。 as_view(),name ='profile_update'),' – mrkre

0
  1. 反向如何限制訪問:

你必須明確地檢查URL中的id是否與登錄用戶的id相同。該檢查缺失,因此用戶1能夠看到用戶2的配置文件。把它放在視圖的開始處。

  1. reverse_lazy不工作:

您可以直接創建Django的網址鏈接/型材/,而不是反向匹配。

  1. 什麼是節約

創建新對象之前,當防止形式從創建重複鍵的最佳實踐,檢查其已經存在並進行更新。

+0

我嘗試添加一個'try ... catch'來檢查配置文件是否存在,如果不存在,則保存CreateView。但是,我收到一個錯誤,說'列'空值'user_id'違反非空約束' – mrkre

+0

這意味着user_id字段不是空的,你沒有提供它創建配置文件對象時。在UserProfile創建期間將用戶與其他參數一起傳遞。 – Sudipta