【问题标题】:How to disable checkboxes in MultipleChoiceField?如何禁用 MultipleChoiceField 中的复选框?
【发布时间】:2017-09-22 12:05:46
【问题描述】:

我在表单中使用 MultipleChoiceField。它向我显示 REQUIREMENTS_CHOICES 列表,其中包含复选框,用户可以在其中选择并向数据库添加新需求。是否可以禁用数据库中已经存在的复选框(在我的情况下是要求)?假设我在数据库中有 A 和 C,所以我不需要它们。

tulpe 中的第一个值是需求的符号,第二个值是需求的名称。

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)

【问题讨论】:

    标签: python django algorithm django-1.10


    【解决方案1】:

    您可以在表单初始化时对其进行操作:

    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 作为选项。

    【讨论】:

    • 您好!我添加了我的视图,该视图使用选定的数据添加了新对象(在我的情况下是要求)。每个对象有 3 个字段:代码、名称、符号。我对你的这行代码有点困惑:if choice[1] not in symbols。我在哪里以及如何获取符号?例如,在视图中,我使用以下代码选择符号:symbols = form.cleaned_data.get('symbol') # ['A', 'B', 'C']
    • 我正在尝试更改构造函数:form = RequirementAddForm(request.POST, symbols=symbols) 但它说symbols=symbols 不正确。你怎么看?!
    • 您必须重新排列 requirement_add 以获取现有的 symbols 以获得新需求,然后将它们传递给构造函数。
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多