2012-07-26 42 views
5

我看到了另一個回答here和網絡上的其他地方,推薦使用user.get_profile擴展內置的django用戶。我在下面的例子中沒有這樣做。該功能似乎工作正常,但沒有使用user.get_profile()有一個缺點?什麼時候應該在django中使用user.get_profile?

模型

class UserProfile(models.Model): 
    user = models.ForeignKey(User, primary_key=True) 
    quote = models.CharField('Favorite quote', max_length = 200, null=True, blank=True) 
    website = models.URLField('Personal website/blog', null=True, blank=True) 

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('quote', 'website') 

視圖

@login_required 
def user_profile(request): 
    user = User.objects.get(pk=request.user.id) 
    if request.method == 'POST': 
     upform = UserProfileForm(request.POST) 
     if upform.is_valid(): 
      up = upform.save(commit=False) 
      up.user = request.user 
      up.save() 
      return HttpResponseRedirect('/accounts/profile') 
    else: 
     upform = UserProfileForm() 
    return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request)) 
+0

您可以刪除View的'user = User.objects.get(pk = request.user.id)'行。 'request.user'已經是用戶模型實例。另外,'locals()'是可疑的命名;它沒有在視圖中定義,所以它真的是本地的? – JCotton 2012-07-26 17:39:18

+2

@JCotton使用['locals()'](http://docs.python.org/library/functions.html#locals)是一個內置函數。在這裏它被用作hack來避免必須手動定義模板上下文字典。這是一個節省時間的方法,但是明確定義上下文可能更好。關於'request.user'的好處。 – Alasdair 2012-07-26 21:13:56

+0

@Alasdair嘿謝謝!不知道關於'locals()' – JCotton 2012-07-26 21:53:55

回答

3

代碼工作作爲你寫它,而是因爲你沒有一個實例傳遞給你的模型是有點不尋常,所以它可能再讓另一個Django開發人員花點時間來研究發生了什麼。

您鏈接到的視圖用實例實例化模型窗體,以便現有的配置文件值顯示在窗體中。在你的情況下,你會得到空的領域。

upform = UserProfileForm(instance=user.get_profile()) 

因爲你不提供一個實例,節約會嘗試創建一個新的user_profile,這是我們不希望。這不會發生在你的情況下,因爲你已經使user成爲主鍵,但這也有點不尋常。

編寫user.get_profile()的主要優點是您不需要知道用戶配置文件使用哪個模型。如果您很高興在您的代碼中對UserProfile模型進行硬編碼,則可以將其替換爲instance=UserProfile.objects.get(user=user)

+0

你的意思是用你上面寫的東西替換「user = User.objects.get(pk = request.user.id)」這一行,除了替換「upform = UserProfileForm(request.POST)「與」upform = UserProfileForm(instance = user.get_profile())「? – sharataka 2012-07-26 20:41:46

+0

將用戶行保持原樣,或按照上面註釋中的JCotton建議的'user = request.user'替換它。在創建表單時,'instance'是一個額外的參數,它不會取代'data = request.POST'。設置'instance' * *兩次*你創建窗體。 – Alasdair 2012-07-26 21:35:41

相關問題