Python Django:使用输入选项创建多选表单

Python Django:使用输入选项创建多选表单,python,django,Python,Django,我想问一下,是否有人知道如何在表单中进行选择,其中一个选择是添加输入 在my forms.py中: class InRes(forms.ModelForm): class Meta: model=Results 在my models.py中: PORT_STATUS=( ('FTP','21'), ('HTTP','443,80'), ) class Results(models.Model): status=models.CharField

我想问一下,是否有人知道如何在表单中进行选择,其中一个选择是添加输入

在my forms.py中:

class InRes(forms.ModelForm):

    class Meta:
        model=Results
在my models.py中:

PORT_STATUS=(
    ('FTP','21'),
    ('HTTP','443,80'),
)

class Results(models.Model):
    status=models.CharField(max_length=5, choices=PORT_STATUS, default='HTTP')
我想添加和选项以选择其中一个选项或输入我自己的输入。
有什么想法吗?

Django表单对于什么是有效的选择非常挑剔,这是一件好事。它可以防止恶意值通过被操纵的POST数据传入

因此,您将无法以编程方式添加选项,一是因为您的选项是硬编码的元组,二是因为您添加的任何选项都不会成为运行clean时表单认为有效的选项的一部分,因为初始化表单时该值不在其中

取而代之的是,考虑选择一个单独的模型,并提供一个单独的表单字段来为该模型添加一个记录,这样下次选择就会出现。 Django表单可以混合使用模型字段和非模型字段,因此可以使用它们来添加输入字段。您还可以通过JavaScript控制额外字段的可见性。可能可以将所有这些合并到一个自定义字段的多窗口小部件中

# theoretical code, not tested

class PortStatus(models.Model):
    status = models.CharField(max_length=100)

    def __unicode__(self):
        return self.status


# I prefer singular model names

class Result(models.Model):
    status = models.ForeignKey(PortStatus, blank=True)


class ResultsForm(forms.ModelForm):

    class Meta:
        model = Result

    extra_choice = forms.CharField(max_length=100, required=False)

    def __init__(self, *args, **kwargs):
        super(ResultsForm, self).__init__(*args, **kwargs)
        self.save_new_status = False

    def clean(self):
        cleaned_data = self.cleaned_data()
        status = cleaned_data.get('status')
        extra_choice = cleaned_data.get('extra_choice')

        if status and extra_choice:
            raise forms.ValidationError("Can't specify both")

        if not status and not extra_choice:
            raise forms.ValidationError('Make a selection or add status')

        if not status and extra_choice:
            # make sure extra_choice isn't already in choices
            if PostStatus.objects.filter(
                status__iexact=extra_choice).count() > 0:
                    raise forms.ValidationError('Status present, etc')
            else:
                self.save_new_status = True

        return cleaned_data

    def save(self, commit=True)
        instance = super(ResultsForm, self).save(commit=False)
        if self.save_new_status:
            new_status = PostStatus.objects.create(
                status=self.cleaned_data.get('extra_choice'))
            self.status = new_status
        if commit:
            instance.save()
        return instance

没有Django小部件。您必须在CharField中允许一个空选项,例如考虑一个'OTHER','OTHER',并为其设置另一个字段。您的问题现在变成了JavaScript问题。