django ForeignKey에 관한질문입니다.

조회수 3047회

첫번째 질문은 아래 코드 ForeignKey의 차이점이 무엇인지 알 수 있을까요? Company에 하나는 " "표시가 되어있는데 어떤것이 다른지 모르겠습니다. 결과는 똑같이 나오는데 스택오버플로우에서는 ""사용하시는분도 계시고 안사용하는 분도 계셔서 궁금했습니다.

   class Register(models.Model): #회원가입폼
        user=models.OneToOneField(User,on_delete=models.CASCADE) #id/PW/Email
        company=models.ForeignKey(Company) #회사명

   class Register(models.Model): #회원가입폼
        user=models.OneToOneField(User,on_delete=models.CASCADE) #id/PW/Email
        company=models.ForeignKey("Company") #회사명

두번째 질문은 ForeignKey 저장입니다. models.py 내용입니다.

class Register(models.Model): #회원가입폼
    user=models.OneToOneField(User,on_delete=models.CASCADE) #id/PW/Email
    company=models.ForeignKey(Company) #회사명
    office=models.CharField(max_length=30) #지점 및 부서

     def __str__(self):
            return self.company+" "+self.office




class Apply(models.Model):
    register=models.ForeignKey(Register,null=True)
    serialnumber=models.CharField(max_length=30) #시리얼넘버
    name=models.CharField(max_length=30) #접수자명

forms.py 에 내용입니다.

class ApplyForm(forms.ModelForm):
class Meta:
    model = Apply
    exclude = ['register']
    fields = ('serialnumber','name')
def save(self, commit=True, id=0):
    apply = super(ApplyForm, self).save(commit=False)
    if commit:
        apply.register=Register.objects.get(pk=id)
        apply.save()
    return apply

views.py 내용입니다.

def apply(request): #신청화면
    if request.method == 'POST':
       appfrom = ApplyForm(request.POST)
       if appfrom.is_valid():
         appsave=appfrom.save(commit=False,id=request.user.id)
         appsave.save()
         return HttpResponseRedirect('/lookup/')
    else:
         appfrom = ApplyForm()
    return render(request, 'as/apply.html', {'appfrom': appfrom})

결과 이미지  register에는 아무런 값이 없네요ㅜ.ㅜ

목표는 저 테이블 register에 company와 office를 출력을 원합니다.

이미지

지금 상태에서는 저 둘중 하나를 골라야하는데 제가 원하는 것은 회원이 정한 부서를 자동으로 선택 되어지게 만드는 것이였는데 말씀하신것은 그냥 저장 아닌신가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 추가 질문사항은 답변에 편집요청을 하지 마시고, 질문에 추가내용을 넣어 주세요. 올려주신 내용을 보니 `form.save(id=request.user.id)`이어야 하는데 `form.save(id=request.user)`이렇게 쓰고 계신것 같습니다. 정토드 2016.5.20 14:51
  • 그리고 Apply에 이미 Register가 Foreignkey로 등록되어 있으니 apply.register.company로 회사명을 얻어올 수 있습니다. 정토드 2016.5.20 14:52
  • 내용을 수정했습니다. 확인 부탁드립니다. 알 수 없는 사용자 2016.5.23 11:14
  • 질문을 다시 올려주시는게 좋겠습니다. apply를 출력하면서 company와 office의 출력하는것은 답변이 되었다고 생각하구요. 드롭다운 메뉴를 통해 팀을 선택하면 그 팀의 Apply만 보여주는건 다른 질문같네요. 정토드 2016.5.24 16:18
  • 넵 알겠습니다. 감사합니다.^^ 알 수 없는 사용자 2016.5.24 16:43

1 답변

  • (1) models.ForeignKey의 init 코드를 보니 모델 또는 모델의 이름을 넣어주면 되네요. 둘 다 상관 없는것 같습니다.

    (2) Apply.save()전에 Apply.register = Register.objects.get(id)가 와야 합니다. save를 하지 않으면 DB에 반영되지 않으니까요.

    추가로.

    Apply = super(ApplyForm, self).save(commit=False)
    

    apply = super(ApplyForm, self).save(commit=False)
    

    로 바꿔주시면 더 보기가 좋을것 같습니다. Apply를 이미 모델명으로 사용하고 있어서 햇갈리네요.


    추가내용

    Apply.register=Register.objects.get(pk=id)
    

    와 같이 수정해 보세요. 그리고 id가 어디에서도 정의되어 있지 않은것 같은데요? views.py에서 save를 부를때 form.save(id=request.user.id)와 같이 불러주시고, save는 다음과 같이 id를 받아와야겠습니다.

    def save(self, commit=True, id=0):
    
    • 여전히 Save가 안된다고 편집요청 주셨는데요. views.py에서 form.is_valid()체크를 하고 있나요? 혹시 is_valid를 통과하는지 확인해 보시고, 통과 안한다면 form.errors에 무슨 내용이 들어 있는지 확인해 보세요. 정토드 2016.5.19 18:25
    • 답변을 추가했습니다. 정토드 2016.5.19 18:41
    • 질문을 수정했습니다 ㅜ.ㅜ 알 수 없는 사용자 2016.5.23 11:12
    • apply를 가져온 다음에 apply.register.company, apply.register.office를 사용하시면 되지 않을까요? 정토드 2016.5.23 14:08
    • def save를 말씀하신건가요? 알 수 없는 사용자 2016.5.23 14:24
    • views를 말씀하신건가요? 알 수 없는 사용자 2016.5.23 14:25
    • save까지는 이제 잘 되시져? 그럼 접수내용화면에서 결과를 보여줄때 company와 office값을 뿌려줄때 apply.register.company, apply.register.office와 같이 사용하면 된다는 의미입니다. 정토드 2016.5.23 14:53
    • 죄송합니다 위에 다시한번 수정해 놓았고요. 말씀하신것은 그냥 저장을 말씀하신것같은데 저는 ForeignKey를 모델로 만들때 Register값을 자동으로 선택되게 만들고 싶어서 질문을 올렸는데 말씀하신것으로 했을 경우 선택되어 있지 않습니다. 알 수 없는 사용자 2016.5.23 15:31

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)