2017-04-25 9 views
1

Multiple ChoiceField을 형식으로 사용합니다. 그것은 내게 REQUIREMENTS_CHOICES 사용자가 데이터베이스에 새로운 요구 사항을 선택하고 추가 할 수있는 확인란을 표시합니다. 이미 데이터베이스에있는 체크 박스를 비활성화 할 수 있습니까? 내가 데이타베이스에 A와 C를 가지고 있다고 말하면 내가 필요 없다.MultipleChoiceField에서 체크 박스를 비활성화하는 방법은 무엇입니까?

줄다리의 첫 번째 값은 요구 사항의 상징이며, 두 번째 값은 요구 사항의 이름입니다.

models.py :

class Requirement(models.Model): 
    code = models.UUIDField(_('Code'), primary_key=True, default=uuid.uuid4, editable=False) 
    symbol = models.CharField(_('Symbol'), max_length=250) 
    name = models.CharField(_('Name'), max_length=250) 

는 forms.py :

REQUIREMENTS_CHOICES = (
     ('A', 'Name A'), 
     ('B', 'Name B'), 
     ('C', 'Name C'), 
     ('D', 'Name D'), 
) 


class RequirementAddForm(forms.ModelForm): 
    symbol = forms.MultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple, choices=REQUIREMENTS_CHOICES,) 

    class Meta: 
     model = Requirement 
     fields = ('symbol',) 

는 views.py :

def requirement_add(request): 
    data = dict() 
    if request.method == 'POST': 
     form = RequirementAddForm(request.POST) 
     if form.is_valid(): 
      list = dict(REQUIREMENTS_CHOICES) # {'C': 'Name C', 'A': 'Name A', 'B': 'Name B'} 
      symbols = form.cleaned_data.get('symbol') # ['A', 'B', 'C'] 
      requirement = form.save(commit=False) 
      for symbol in symbols: 
       requirement.symbol = symbol 
       requirement.name = list[symbol] 
       requirement.save() 
      data['form_is_valid'] = True 
      requirements = Requirement.objects.filter() 
      context = {requirement': requirement, 'requirements': requirements} 
      data['html_requirement'] = render_to_string('project/requirement_list.html', context) 
     else: 
      data['form_is_valid'] = False 
    else: 
     form = RequirementAddForm() 
    context = {'form': form} 
    data['html_requirement_form'] = render_to_string('project/requirement_add.html', context, request=request) 
    return JsonResponse(data) 

답변

1

당신은 당신을 조작 할 수 있습니다 그것에 R 형태는 초기화이다 : 위의 어떻게됩니까

REQUIREMENTS_CHOICES = (
     ('A', 'Name A'), 
     ('B', 'Name B'), 
     ('C', 'Name C'), 
     ('D', 'Name D'), 
) 


class RequirementAddForm(forms.ModelForm): 
    def __init__(self, symbols='', *args, **kwargs): 
     super(RequirementAddForm, self).__init__(*args, **kwargs) 

     UPDATED_CHOICES =() # empty tuple 
     for choice in REQUIREMENTS_CHOICES: 
      if choice[1] not in symbols: 
       UPDATED_CHOICES += (choice,) # adds choice as a tuple 

     self.fields['symbol'] = forms.MultipleChoiceField(
            required=False, 
            widget=forms.CheckboxSelectMultiple, 
            choices=UPDATED_CHOICES, 
           ) 

    class Meta: 
     model = Requirement 

:

  1. 당신은 초기화하면 양식
    (예 : form=RequirementAddForm(symbols=existing_symbols))이, 생성자에 전달할 수있는, 기존의 기호와 문자열 데이터베이스에있는 항목
  2. __init__ 함수는 어떤 선택 항목이 이미 symbols에 있는지 확인하고 이에 따라 UPDATED_CHOICES을 업데이트합니다.
  3. symbol이라는 필드는 생성자의 양식에 추가되며, 선택 항목에는 UPDATED_CHOICES이 있습니다.
+0

안녕하세요! 선택한 데이터로 새 오브젝트 (내 경우 요구 사항)를 추가하는 내보기를 추가합니다. 각 객체는 코드, 이름, 심볼의 3 개의 필드를 가지고 있습니다. 나는이 코드 줄에 약간의 혼란을 느낀다.'선택 안하면. ' 어디에서 어떻게 기호를 가져 가나? 예를 들어,보기에서 나는이 코드에 의해 선택된 기호들을 가져 간다 :'symbols = form.cleaned_data.get ('symbol') # [ 'A', 'B', 'C']' –

+0

나는 생성자를 변경하려고한다. = RequirementAddForm (request.POST, symbols = symbols)'하지만'symbols = symbols'이 올바르지 않다고 말합니다. 그것에 대해 어떻게 생각하세요?! –

+0

새로운 요구 사항에 대한 기존'심볼 '을 가져오고 생성자에 전달하기 위해'requirement_add'를 재정렬해야합니다. –