2013-10-31 2 views
0

현재 입력 된 도메인을 db에 제출하는 모델 양식이 있습니다.양식 제출시 Django Auth "User"ID를 받으십시오.

내가 겪고있는 문제는 DB 끝에 PK-FK 관계를 충족시키기 위해 도메인을 제출할 때 현재 로그인 한 사용자의 ID (django.auth 테이블의 PK)를 저장해야한다는 것입니다.

내가 현재 가지고 : "열 'FKtoClient_id는'null 일 수 없습니다 (1048 :

class SubmitDomain(ModelForm): 
    domainNm = forms.CharField(initial=u'Enter your domain', label='') 
    FKtoClient = User.<something> 

    class Meta: 
     model = Tld #Create form based off Model for Tld 
     fields = ['domainNm'] 

def clean_domainNm(self): 
    cleanedDomainName = self.cleaned_data.get('domainNm') 
    if Tld.objects.filter(domainNm=cleanedDomainName).exists(): 
     errorMsg = u"Sorry that domain is not available." 
     raise ValidationError(errorMsg) 
    else: 
     return cleanedDomainName 

views.py

def AccountHome(request): 
    if request.user.is_anonymous(): 
     return HttpResponseRedirect('/Login/') 

    form = SubmitDomain(request.POST or None) # A form bound to the POST data 

    if request.method == 'POST': # If the form has been submitted... 
     if form.is_valid(): # If form input passes initial validation... 
      domainNmCleaned = form.cleaned_data['domainNm'] ## clean data in dictionary 
      clientFKId = request.user.id 
      form.save() #save cleaned data to the db from dictionary` 

      try: 
       return HttpResponseRedirect('/Processscan/?domainNm=' + domainNmCleaned) 
      except: 
       raise ValidationError(('Invalid request'), code='300') ## [ TODO ]: add a custom error page here. 
    else: 
     form = SubmitDomain() 

    tld_set = request.user.tld_set.all() 

    return render(request, 'VA/account/accounthome.html', { 
     'tld_set':tld_set, 'form' : form 
    }) 

을 문제는이 나에게의 오류를 준다 ") 매우 이상한 일이 열 FKtoClient에 대해 제출하려고 시도 : 7 (이 사용자 기록의 PK) 대신 7L을 제출하려고합니다. 어떤 아이디어? 누군가가 도와주세요 수 있다면

, 정말 감사하겠습니다 그것을

+1

'7L'에 대해 걱정할 필요가 없습니다. [이 질문에 대한 답변] (http://stackoverflow.com/questions/11764713/why-do-integers-in-database-row-tuple-have-an-l- 접미사). – Alasdair

답변

2

양식에서 FKtoClient를 제거 : 양식을 제출, 당신은 뭔가를 할 수 있습니다. 보기에서 요청 개체를 사용할 수있는 사용자를 설정해야합니다. 현재 사용자를 자동으로 설정하는 양식에 속성을 설정할 수 없습니다.

양식을 인스턴스화 할 때 이미 사용자가 설정된 tld 인스턴스를 전달할 수 있습니다.

def AccountHome(request): 
    # I recommend using the login required decorator instead but this is ok 
    if request.user.is_anonymous(): 
     return HttpResponseRedirect('/Login/') 

    # create a tld instance for the form, with the user set 
    tld = Tld(FKtoClient=request.user) 
    form = SubmitDomain(data=request.POST or None, instance=tld) # A form bound to the POST data, using the tld instance 

    if request.method == 'POST': # If the form has been submitted... 
     if form.is_valid(): # If form input passes initial validation... 
      domainNm = form.cleaned_data['domainNm'] 
      form.save() #save cleaned data to the db from dictionary 

      # don't use a try..except block here, it shouldn't raise an exception 
      return HttpResponseRedirect('/Processscan/?domainNm=%s' % domainNm) 
    # No need to create another form here, because you are using the request.POST or None trick 
    # else: 
    # form = SubmitDomain() 

    tld_set = request.user.tld_set.all() 

    return render(request, 'VA/account/accounthome.html', { 
     'tld_set':tld_set, 'form' : form 
    }) 

이 필요한 경우 self.instance.user 같은 형태의 방법 내에서 user에 액세스 할 수 있다는 것입니다 @ dm03514의 대답에 비해 장점이있다.

+0

어떻게이 코드를 구현하여 사용자 ID를 얻을 수 있습니까? – CodeTalk

+0

질문을 이해할 수 없습니다. 위의 예제는'tld.user'를 요청하는 사용자로 설정합니다. 사용자 ID에 액세스하려면'request.user.id'를 사용하십시오. 폼 클래스에'FKtoClient'를 선언 할 방법이 없으며, 현재 요청에있는 폼을 마술처럼 업데이트 할 수 있습니다. 사용자에게 접근하려면보기 (또는 적합한 모델 관리 메소드)에서'request.user'에 액세스 한 다음 폼이나 인스턴스를 업데이트해야합니다. – Alasdair

+0

request.user.id로 사용 예를 보여 주시겠습니까? – CodeTalk

0
당신은 요청 객체에서 로그인 한 사용자가 얻을 수있는

:

current_user = request.user 
+0

하지만 django 인증 사용자 테이블에서 사용자 ID를 얻으려면 어떻게해야합니까? 사용자가 이미 올바르게 인증되었습니다. – CodeTalk

+0

request.user.id? – Ogre

+0

이것을 form.py에서 사용할 수 있습니까? 어떤 수입이 필요합니까? – CodeTalk

1

당신은 사용자가 로그인하도록 요구하려면 , 첫째

@login_required # if a user iS REQUIRED to be logged in to save a form 
def your_view(request): 
    form = SubmitDomain(request.POST) 
    if form.is_valid(): 
    new_submit = form.save(commit=False) 
    new_submit.your_user_field = request.user 
    new_submit.save() 
+0

요청이 아닙니다. 사용자는 이미 인증되었습니다. 그는 양식을 제출 중이고 제출시 현재 양식 항목을 제출하지만 이미 로그인 한 사용자의 ID도 포함해야합니다. 말이 돼? – CodeTalk

+0

이 예제보기는 폼을 저장할 때 사용자를 설정하는 방법을 보여줍니다. 같은 일을하도록보기를 조정할 수 있어야합니다. 보기보다는 장고 관리자에서이 작업을 수행하려는 경우 질문을 업데이트해야합니다. – Alasdair