2012-07-26 29 views
5

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)) 
+0

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

+2

@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

+0

@Alasdair hey teşekkürler! "locals()" – JCotton

cevap

3
kod bunu yazdım, ancak modele bir örneğini geçemiyor çünkü bu olabilir bu yüzden, biraz sıradışı olarak çalışmaktadır

Neler olduğunu öğrenmek için başka bir Django geliştiricisini biraz daha uzun sürebilir.

Model formunu bir örnekle başlatmak için bağladığınız görünüm, böylece varolan profil değerlerinin formda görüntülenmesi sağlanır. Senin durumunda boş alanlar olacak. Biz istemem, hangi yeni user_profile oluşturmaya çalışacağını söyledi tasarruf

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

Eğer bir örneğini vermeyin Çünkü

. Durumunuzda bu olmayacak, çünkü birincil anahtarı user yaptınız, ama bu biraz sıradışı.

user.get_profile() yazmanın ana avantajı, kullanıcı profili için hangi modelin kullanıldığını bilmenize gerek olmamasıdır. Kodunuzda UserProfile modelini kodlamaktan memnunsanız, bunun yerine instance=UserProfile.objects.get(user=user)'u koyabilirsiniz.

+0

hakkında, "upform = değiştirmeye ek olarak yukarıda yazdığınızlarla" user = User.objects.get (pk = request.user.id) "satırını değiştirmek demek istemediniz UserProfileForm (request.POST) "with" upform = UserProfileForm (örnek = user.get_profile()) "? – sharataka

+0

Kullanıcı satırını olduğu gibi bırakın veya yukarıdaki yorumda JCotton tarafından önerilen şekilde "user = request.user" ile değiştirin. Formu oluştururken, 'instance' ekstra bir argüman, 'data = request.POST' yerine geçmez. Formu oluşturduğunuzda her iki kez * örneğini * ayarlayın. – Alasdair

İlgili konular