2014-01-25 2 views
0

응답 모델이있는 설문 조사가 있는데, 나는 기존 사용자와 연결하고 싶습니다. 프로필 페이지의 설문 조사에 대한 과거 응답을 볼 수 있어야합니다. 어쨌든 그 계획입니다. 하지만 나는 사용자를 응답에 연결할 수조차 없다.foreign_key로 user_id를 저장하십시오.

(장고 == 1.5, 장고 - lazysignup)

사용자는 연결

# models.p 
from django.contrib.auth.models import User 
class Response(models.Model): 
    survey = models.ForeignKey(Survey) 
    user = models.ForeignKey(User) 
    ... 

#views.py 
@allow_lazy_user 
def survey_detail(request, slug): 
    ... 
    if form.is_valid(): 
     response = form.save(commit=False) 
     response.user = request.user 
     response.save() 
     ... 

오류 얻기 위하여 응답의 외래 키 현재 :

IntegrityError: null value in column "user_id" violates not-null constraint 

필드는 user_id는 테이블 응답에 포함됩니다. 남쪽의 스키마 마이 그 레이션 때문에 일회성 값을 설정하고 기존의 user_id를 선택해야했습니다.

의견이 있으십니까?

+0

지연 사용자가 생성 되었습니까? 'response.form = save() '란 무엇입니까? 나는 그것이'response.save()'여야한다고 생각한다. – sneawo

+0

네, 맞습니다. 그것은'response.save()'입니다. 나는 그것을 편집했다. 그리고 예, 게으른 사용자가 생성됩니다. 귀하의 대답은 –

답변

0

그것은 null=True, blank=True

class Response(models.Model): 
    survey = models.ForeignKey(Survey) 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 
1

는 당신이 코드는 좋아 보인다 사용하여 작동합니다. 문제를 해결하려면 먼저 사용자 개체를 저장하기 전에 검사해야합니다. print type(request.user), request.user. 또한 응답 모델 객체를 검사하여 예상 한 결과인지 확인할 수도 있습니다. 양식 코드 또는 데코레이터를 검사해야하는지 여부를 나타냅니다.

사우스 마이 그 레이션에 대한 "일회성 값 설정"이 무슨 뜻인지 잘 모르겠습니다. 남한은이 일과 관련이 없습니다. 고정 된 user_id를 사용하여 양식을 저장하는 해킹에 대해 이야기하고 있습니까? 그건 맞지 않습니다.

독자가 대답 할 때 사용자 FK 필드에 null=True, blank=True을 설정하면 효과가 있지만 실제로는 아무도 응답을 제출할 수 없다는 의미입니다. 그렇게하면 증상을 수정하는 것처럼 보입니다.

django-lazysignup ("django-lazyuser"는 문제가 아님)? 잠재적 인 함정이 있습니다. 간단히 말해이 패키지는 convert/ URL을 방문하여 공식 사용자가 될 수있는 사용자 이름과 암호를 선택할 수있는 임시 사용자를 만듭니다. 모든 사람이 그렇게하지는 않을 것이므로, 변환되지 않은 게으른 사용자를 제거하는 관리 명령이 있습니다. 이 명령은 LazyUser 모델 객체 실제 사용자 모델 객체를 삭제합니다. 기본적으로 Django는 관련된 객체를 삭제합니다. 귀하의 응답 개체. 숨겨진 게으른 사용자와 연관된 응답을 자동으로 삭제하지 않으려면 ForeignKey (docs)에 cascade 속성을 설정하십시오. user = models.ForeignKey(User, on_delete=models.PROTECT)과 같은 것이고 ProtectedError이 안전하게 처리되었는지 확인하십시오. 이 작업은 정리 관리 명령을 사용하는 경우에만 중요하지만 미안한 사람보다 안전하고 코드를 유지 관리하는 다음 사람이 정리 작업을 수행 할 수 있습니다. 누가 정리 작업을 싫어하기 때문입니다.

+0

+1입니다. 예, 저는 장고 - 라지 스티커를 사용하고 있습니다. 나는 내 질문에 그것을 고쳤다. 당신은 정리 루틴에 대해 옳습니다. 나는 그것에 대해 생각하지 않았다. 학사 학위 논문의 기초로서 자체 설문 조사 신청서를 작성해야합니다. 내 교수는 사용자가 과거의 투표 옵션을 보러 가입 할 수 있다면 좋을 것이라고 말했다. 설문 조사는 정보 보안에 관한 것이다. 이제 옵션을 선택해야합니다 : (i) 투표하기 전에 로그인 요구 사항이 있거나 (ii) 모든 사람이 투표 할 수 있습니다. 로그인을하려면 사용자가 게으 르기 위해 로그인해야합니다. 그러므로 lazysignup은 투표 후 답변을 유지할 수 있습니다. –

+0

계정을 만들 때 오버 헤드없이 설문 조사를 허용하는 것이 좋습니다.잠재 고객을 평가할 수 있지만 계정 생성은 큰 장애물입니다. 정리가 데이터를 삭제하지 않는 한, 지연 정보 및 응답 날짜가 있으면 충분할 수 있습니다. LazySignUp을 사용하려면 스마트! 설문 조사 제출 후 언제든지 "감사, 사용자 이름과 비밀번호를 추가하여 과거 답변보기"페이지를 제공 할 수 있습니다. 좋은 기능. – JCotton

+0

고마워. J. 나는 지금 lazysignup을 지킬거야. 정리 루틴을 비활성화하고 소스 코드에서 문서화 할 수 있는지 확인합니다. –