2017-07-17 31 views
0

我有兩個模型,我將允許用戶單獨編輯,一個稱爲用戶(Django默認身份驗證),另一個是UserProfile。如何在Django中驗證我的表單或視圖,以便他們只能將用戶模型編輯爲屬於該數據的用戶模型?

models.py(用戶配置)

class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    avatar = models.ImageField(upload_to='avatar', default='avatar/default.png') 
    header = models.ImageField(upload_to='header', default='header/default.png') 
    bio = models.TextField(max_length=140, blank=True) 
    website = models.URLField(max_length=200, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    date_birth = models.DateField(null=True, blank=True) 

views.py

class UserUpdateView(generic.UpdateView): 
    """ 
    This view is for editing only the User model. /edit/ 
    """ 
    model = User 
    slug_field = 'username' 
    form_class = UserForm 
    template_name = 'user/user_edit.html' 

回答

1

首先,使用LoginRequiredMixin混入使得只有登錄的用戶可以訪問該視圖。

然後,覆蓋get_object方法,並返回要編輯的模型實例。

您不需要URL中的用戶名,因此您可以刪除slug_field = 'username'

from django.contrib.auth.mixins import LoginRequiredMixin 

class UserUpdateView(LoginRequiredMixin, generic.UpdateView): 
    model = User 
    form_class = UserForm 
    template_name = 'user/user_edit.html' 

    def get_object(self): 
     return self.request.user 

如果您有類似的編輯用戶配置文件的視圖,您將返回self.request.user.userprofile

+0

但我有一個問題,我有這個用戶「cotizcesar」和這個URL(http://.../u/cotizcesar/edit/)。 當訪問另一個用戶(http://.../u/oboro/edit/)時,我可以如何將用戶重定向到自己的URL? –

+0

我的建議是您完全從網址中刪除用戶名,並使用'/ u/edit /'代替。如果你想檢查用戶名和重定向,你可以重寫調度方法。 – Alasdair

+0

感謝您的幫助,我會給您答案的答案,非常好,很短。但我認爲,當我有一個名稱編輯的用戶名,例如它會產生衝突。 示例:https://plxapp.herokuapp.com/ –

相關問題