2012-07-27 2 views
1

저는 사용자 프로필을 확장하기 위해 modelform을 사용하고 있습니다. 이전에 저장 한 데이터를 사용자가 쓰기 전에 양식에 표시하고 싶습니다. 어떻게 내가 장고와 함께 템플릿에서 이렇게합니까?django를 사용하여 템플릿에 표시 할 기본값을 얻으려면 어떻게해야합니까?

모델

class UserProfile(models.Model): 
    user = models.ForeignKey(User, primary_key=True) 
    quote = models.CharField('About', 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') 
     widgets = { 
      'quote': Textarea(attrs={'cols': 18, 'rows': 7, 'style': "width: 300px;"}), 
     } 

보기

@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)) 

템플릿

{{ upform.as_p}} 

답변

6

패스 instance=user.get_profile() 당신이 그것을 인스턴스화 할 때 UserProfileForm합니다. 그래서

Quote: {{ upform.quote }} 

해야 출력 이미

:

@login_required 
... 
    else: 
     upform = UserProfileForm(instance=user) 
... 

당신은 수동으로 템플릿을 구축해야 할 수도 있습니다

+0

"upform = UserProfileForm (request.POST, instance = user.get_profile())"으로 변경했습니다. 템플릿의 내용을 변경해야합니까? – sharataka

+0

템플릿을 변경해야하는지 알 수 있도록 템플릿을 표시해야합니다. – armonge

+0

@armonge 양식과 관련된 템플릿에있는 모든 것은 위에 나열된 것입니다. 기본 데이터 (이미 사용자가 입력 한 데이터)를 포함하도록 편집하는 방법을 모르겠습니다. – sharataka

-1

나는 당신이 단지 형태의 인스턴스로 사용자를 전달 생각 '구원받은'견적.

+0

왜 투표가 끝났습니까? 이것은 효과가있다. – Lonoshea

0

instance=profile을 양식을 인스턴스화하는 위치에 모두 전달하십시오. 조금 더 쉽게, 당신은 ** 키워드 확장 연산자를 사전인가를 만들고 사용할 수 있는지 확인하려면, 당신은 하나가 아닌 사용자 인스턴스를 전달하는 경우

@login_required 
def user_profile(request): 
    user = User.objects.get(pk=request.user.id) 
    form_kwargs = {} 
    try: 
     form_kwargs['instance'] = user.get_profile() 
    except Profile.DoesNotExist(): # change Profile to whatever your profile model is named 
     pass 

    if request.method == 'POST': 
     upform = UserProfileForm(request.POST, **form_kwargs) 
     if upform.is_valid(): 
      up = upform.save(commit=False) 
      up.user = request.user 
      up.save() 
      return HttpResponseRedirect('/accounts/profile') 
    else: 
     upform = UserProfileForm(**form_kwargs) 
    return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request)) 
0

양식은 USERPROFILE 인스턴스를 기대하고있다.

UserProfile 인스턴스를 양식에 전달하는 데 두 가지 이상의 옵션이 있습니다.

옵션 1 get_or_create

당신은 get_or_create를 사용할 수 있습니다. 프로파일을 얻습니다. 존재하지 않으면 프로파일을 작성하고 저장합니다. https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create

userprofile=UserProfile.objects.get_or_create(user=request.user) 

다음 옵션

upform = UserProfileForm(request.POST, instance=userprofile) 
upform = UserProfileForm(instance=userprofile) 

UserProfileForm

의에 모두 전화에 사용자 프로필이 get_profile()는 user.get_profile을 사용하려는 경우

몇 가지, 확인을 통과() 사용자 프로필이 다음과 같이 정확하게 설정되어 있는지 확인해야합니다. https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

주로 설정에 있습니다.사용자가 설정 한 평가 :

AUTH_PROFILE_MODULE = "account.UserProfile" 

이 USERPROFILE는 "계정"라는 응용 프로그램에 정의되어 있다고 가정하면 그 대신에 MyApp를에 : 앞서 언급 한 바와 같이

AUTH_PROFILE_MODULE = "MyApp.UserProfile" 

는 다음 (사용할 수 있습니다) : 당신이 사용자가 여기에 아직 프로필, get_profile을 (생성되지 않았 음을 인스턴스를 처리 할 필요가 있지만 UserProfile.o처럼

upform = UserProfileForm(request.POST, instance=request.user.get_profile()) 
upform = UserProfileForm(instance= instance=request.user.get_profile()) 

가) 실패 bjects.get.

관련 문제