2016-09-23 1 views
1

이 질문은 간단한 질문 일 수도 있지만 어떻게 해야할지 모르겠다. 장고에 두 개의 모델이 있습니다. 자동 채우기 Django OneToOneField

class ModelA(models.Model): 
    some_member = models.Charfield(...) 

class ModelB(models.Model): 
    model = OneToOneField(ModelA) 
    other_member = models.Charfield(...) 

ModelA

는 ModelForm로 채워진 후 ModelB위한 형태로 리디렉션된다. 이전 양식을 기반으로 OneToOneField을 자동 완성하는 방법은 무엇입니까? 도움 주셔서 감사합니다.


나는이 지금

class ModelBView(CreateView): 
....... 
    def form_valid(self, form): 
     model_b = form.save(commit=False) 
     model_a_form = ModelAForm(self.request.POST) 
     model_b.model = model_a_form.save(commit=False) 
     model_b.save() 
     return super(ModelBView, self).form_valid(form) 

처럼 그 일을하지만 오류가 발생하고있다 : "데이터의 유효성을 검사하지 않았기 때문에 ... 만들 수 없습니다."

그래서 여기서 문제는 요청으로 이전 양식의 데이터를 가져올 수 있다는 것입니다. POST. 어떻게이 데이터를 얻을 수 있습니까?

답변

0

아마도 ModelBase의 데이터를 request.session 또는 request.get에 저장하고 ModelB의 다음 페이지로 리디렉션 할 수 있습니다. ModelB의 모델 필드에 대한 데이터를 가져 와서 채울 수 있습니다.

+0

답장은 빠른 답변입니다. 나는 장고에 새로운 사람이다. 어떻게 데이터를 저장할 수 있습니까? – 5yn4x

0

정확히 원하는대로 달라집니다.

두 번째 양식에서 입력란을 자동 완성하려면 ModelB 용 양식을 인스턴스화 할 때 (예 :보기에서) initial 키워드 인수를 사용할 수 있습니다. 다른 한편으로는, 당신이 MODELA는 필드와 두 번째 형태로 나타납니다 만, 여전히 결과 인스턴스에 연결하지 않으려는, 경우이 같은 작업을 수행 할 수 있습니다

def my_view(request): 
    """ 
    Save data to ModelA and show the user the form for ModelB 
    """ 
    if request.method == 'POST': 
     # Save ModelA instance 
     model_a_form = ModelFormA(request.POST) 
     if model_a_form.is_valid(): 
      model_a_instance = model_a_form.save() 

      # Once saved, show the user the form for ModelB, prefilled 
      # with the result from the previous form 
      model_b_form = ModelFormB(initial={'model': model_a_instance}) 

      # etc. Render the page as usual 
     else: 
      # ... 
    elif request.method == 'GET': 
     # ... 

처리 할 때이 같은 두 번째 형식의 응답.

# ... instance of first model is saved in `model_a_instance` 

# Initiate an empty instance of ModelB, with the value of `model` field set to model_a_instance 
model_b_instance = ModelB(model=model_a_instance) 

# Provide it as an instance to your model form 
model_b_form = ModelFormB(request.POST, instance=model_b_instance) 

if model_b_form.is_valid(): 
    # Everything else should work fine. 

희망이 있습니다.

+0

Thx. 나는 두 번째하고 싶다. 이것은 대단히 도움이됩니다. 하지만 어떻게 CreateView 클래스에서이 작업을 수행 할 수 있습니까? – 5yn4x

+0

뷰의'get()'과'post()'메소드를 오버라이드하고 그 로직을 추가해야합니다. –

+0

이 작업을 시도했지만 데이터를 검증하지 않았기 때문에 "...을 (를) 만들 수 없습니다"라는 오류 메시지가 나타납니다. – 5yn4x

관련 문제