2013-07-23 2 views
0

저장 I는 같은 모델로 RSVP 응용 프로그램에서 일하고 있습니다. jQuery를 사용하여 여러 개의 선택 항목을 2 개의 상자로 향상 시켰습니다. 여기서는 선택한 항목이 오른쪽의 상자에 나타납니다.복수 선택이 필드를

forms.py에서와 crispy_forms를 사용하여 :

class RSVPSelectGuestForm(forms.Form):  
    guests = forms.MultipleChoiceField() 

    def __init__(self, *args, **kwargs): 
     profile = kwargs.pop('profile', None) 
     guestlist_pk = kwargs.pop('guestlist_pk', None) 
     super(RSVPSelectGuestForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(
      Field('guests', 
       id='guests-multiple-select', 
      ), 
      FormActions(
       Submit('submit', 'Save'), 
      ),  
     ) 
     self.fields['guests'].choices = [(obj.id, str(obj)) for obj in Guest.objects.filter(profile=profile)] 
     self.fields['guests'].initial = [(obj.guest_id) for obj in RSVP.objects.filter(guestlist_id=guestlist_pk)] 

나는 위의 코드를 제대로 선택 여러 요소를 렌더링 할 수 있어요. 나는 전망에서 모양을 get_form_kwargs에 kwargs를 통과한다.

질문은 이제 RSVP 테이블에서 게스트를 효율적으로 추가/제거하는 방법입니다. 사용자가 게스트를 선택하면, 그 즉시에 추가된다 - 형태를

  1. 프로세스 이벤트가 UI에서 발생 때마다 : 내가 결정할 수 아래 내 제안 된 솔루션 사이에 이동 주저 탁자; 사용자가 사용자의 선택을 취소하면 게스트가 RSVP 테이블에서 제거됩니다. 이로 인해 손님 수가 증가하면 많은 SQL 읽기/쓰기가 발생할 수 있습니다. 양식이 제출 될 때까지

  2. 아무것도 저장하지 않습니다 - 포스트 데이터에서 내가 선택한 옵션의 사전을 만들 것 형태는, 새로운 행이 추가되고 누락 된 행이 제거로드 된 상태와 비교 테이블에서. 이 작업은 2 가지 SQL 작업 만 필요합니다.

누구든지이 문제를 해결하기 위해 좋은 해결책이나 더 좋은 아이디어를 제안 할 수 있습니까? 내 제안에서 간과 할 수있는 문제가 있습니까?

답변

0

나는 솔루션 2를 지금보다 쉽게 ​​달성하기로 결정했습니다. 양식에 다음 메소드를 추가하면 양식 저장시 2 세트의 데이터가 작성되고 비교됩니다. [Python 방식은 쉽습니다.] 그런 다음 대량 작성 또는 대량 삭제를 위해 각각 1 개의 쿼리를 사용할 수 있습니다. 아직 큰 데이터 세트에서이 코드를 테스트하지 않았습니다.

def add_guests(self, added): 
    RSVP.objects.bulk_create([ 
     RSVP(guestlist_id=self.guestlist_pk, guest_id=guest_pk) 
     for guest_pk in added 
    ]) 

def remove_guests(self, removed): 
    RSVP.objects.filter(guestlist_id=self.guestlist_pk, 
     guest_id__in=removed).delete() 

def save(self): 
    data = self.cleaned_data 

    initial_data = set(self.initial_data) 
    new_data = set([int(i) for i in data['guests']]) 

    added = new_data - initial_data 
    removed = initial_data - new_data 

    if added: 
     self.add_guests(added) 
    if removed: 
     self.remove_guests(removed) 

개선을위한 제안 사항이 있으십니까?

관련 문제