Yo uso MultipleChoiceField en forma. Me muestra la lista REQUIREMENTS_CHOICES con casillas de verificación donde el usuario puede seleccionar y agregar nuevos requisitos a la base de datos. ¿Es posible deshabilitar las casillas de verificación (en mi caso, requisitos) que ya están en la base de datos? Digamos que tengo A y C en la base de datos, así que no los necesito.
El primer valor en tulpe es el símbolo del requisito, el segundo valor es el nombre del requisito.
modelos.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)formularios.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',)vistas.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)Puede manipular su formulario en su inicialización:
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 = RequirementLo que sucede arriba:
form=RequirementAddForm(symbols=existing_symbols) ), puede pasar al constructor una cadena con los símbolos existentes para un elemento en su base de datos.__init__ verifica qué opciones ya existen en los symbols y actualiza UPDATED_CHOICES consecuencia.symbol se agrega al formulario desde el constructor, que tiene como opciones UPDATED_CHOICES .