2014-04-24 4 views
0

나는 양식을 가지고 : django ModelMultipleChoiceField에 사용자 정의 선택을 추가하는 방법?

class SearchForm(Form): 
owner = ModelMultipleChoiceField(queryset=User.objects.all(), required=False) 

예상하지만 주인없이 객체를 가지고대로 작동 관련보기 get_queryset()를 사용자 지정 후

. 나는 목록의 상단에 새로운 선택을 추가하고 싶습니다 (0,'Without owner') 그래서 난 소유자없이 개체 만 필터링 할 수 있습니다. 이 옵션을 추가하는 방법은 무엇입니까?

UPDATE : 나는 form.__init__에 검색을 추가하고 사용자 정의 청소 방법을 썼습니다하지만 추가 옵션 뭔가를 선택하면 내가 form.is_valid를 오버라이드 (override) 할 필요가 추측 내 깨끗한 method.I'm에 도착하기 전에 ValidationError을 제기하지만 난 아니에요 그것을 수행하는 방법 그래서 나는 여전히 기본 is_valid 메서드를 사용할 수 있습니다.

내 코드

def __init__(self, *args, **kwargs): 
    super(ClientListSearchForm, self).__init__(*args, **kwargs) 
    self.fields['owner'].choices = \ 
     list(self.fields['owner'].choices)+[('0', 'n/a')] 

def clean_owner(self): 
    logger.debug('CLEAN_OWNER:') 
    data = self.cleaned_data.get('owner') 
    logger.debug('data: %s' % data) 
    if data == 0: 
     logger.debug('Data zero - not assigned') 
     return data 
    users = User.objects.all() 
    if all(e in users for e in data): 
     logger.debug('Data in users - validating ok') 
     return data 
    else: 
     raise ValidationError('Incorrect owner') 

나는 시도 :

def is_valid(self): 
    try: 
     super(ClientListSearchForm, self).is_valid() 
    except ValidationError as e: 
     logger.debug('val error: %s' % e.args) 

하지만 그건도 예외

UPDATE2 추가 된 사용자 정의 유효성 검사기

def userWithEmpty(value): 
    users = User.objects.values_list('pk').all() 
    v =list() 
    for va in value: 
     v.append(int(va)) 
    u = list() 
    for us in users: 
     u.append(int(us[0])) 
    if not (all(e in u for e in v)or v ==0): 
     raise ValidationError('Invalid Value: %s' % value) 

의 유효성을 검사하거나 캐시 있습니까 w 더 나은을 my for 루프보다 iterable의 모든 값을 변환 할 수 있습니까?

개선의 여지가 많아 답변으로 게시하지 않았습니다.

그것은 EEE를 작동이 중지 ... 내가 뭐가 잘못을하고있어 내가 모든 것을 감사합니다 일에 대해 호언 장담을 기다리는 - validators=[]

+2

참조 http://stackoverflow.com/a/5282889/263989 – fasouto

답변

1
내가 다른 접근 방식으로 결국

에서 검증 전에 뭔가가

class ModelMultipleChoiceWithEmptyField(ModelMultipleChoiceField): 
def __init__(self, *args, **kwargs): 
    super(ModelMultipleChoiceWithEmptyField, self).__init__(*args, **kwargs) 
    self.choices = list(self.choices) + [('0', 'Brak')] 

def clean(self, value): 
    if self.required and not value: 
     raise ValidationError(self.error_messages['required'], code='required') 
    if value == [u'0']: 
     return value 
    return super(ModelMultipleChoiceWithEmptyField,self).clean(value) 

훨씬 깨끗하며 작동합니다. 재사용 및 개선 자유롭게

관련 문제