Başka bir yanıtı here ve web'de yerleşik django kullanıcısını genişletirken user.get_profile kullanılmasını öneren başka yerler gördüm. Bunu aşağıdaki örnekte yapmadım. Işlevsellik iyi çalışıyor gibi görünüyor, ancak user.get_profile() kullanmayan bir dezavantajı var mı?Django'da user.get_profile öğesini ne zaman kullanmalıyım?
modeli
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')
görünüm
@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))
Görünümünüzün 'user = User.objects.get (pk = request.user.id) satırını bırakabilirsiniz. 'request.user' zaten Kullanıcı Modeli örneğidir. Ayrıca, 'locals()' şüpheli olarak adlandırılır; Görünümde tanımlanmadı, bu yüzden yerel mi? – JCotton
@JCotton ['locals()'] kullanma (http://docs.python.org/library/functions.html#locals) yerleşik bir işlevdir. Burada, şablon bağlam sözlüğünü manuel olarak tanımlamaktan kaçınmak için bir hack olarak kullanılır. Bu bir zaman tasarrufu, ancak içeriği açıkça tanımlamak muhtemelen daha iyi bir uygulamadır. Request.user' hakkında iyi bir nokta. – Alasdair
@Alasdair hey teşekkürler! "locals()" – JCotton