Django:forms.ChoiceField,覆盖表单 __init__

标签 django python-3.x django-forms django-views choicefield

我正在尝试使用 View 中的值来实现 forms.ChoiceField() 。 如果我在 forms.py 中声明选择,我已经可以做到这一点,但这不是我需要的。

views.py:

def add_crime(request):
        values = [('1','um'),('2','dois'),('3','tres')]
        if request.method == 'POST':
            form = AddCrimeForm(request.POST, values)
            if form.is_valid():
                # do stuff
                return redirect('show_crime')
        else:
            form = AddCrimeForm(request.GET)
        return render(request, 'add_crime.html', {'form': form})

表单.py:

class AddCrimeForm(forms.Form):
    tests = forms.ChoiceField()
    def __init__(self, testList, args, **kwargs):
        self.testList = testList
        super(AddCrimeForm,self).__init__(*args, **kwargs)  # testList not in args!
        self.fields['tests'].widget = forms.CheckboxSelectMultiple()
        self.fields['tests'].choices = self.testList

错误:

AttributeError: 'tuple' object has no attribute 'get'

根据反馈,我是否必须在 forms.py 中使用一个参数实现另一个 __init__ ?这就是我在 Java 中尝试的。

我的最终目标是实现两个 ChoiceField,第二个选择字段取决于第一个。有更好的办法吗?

最佳答案

这里有两个错误:第一个错误在 AddCrimeForm 中。这里 __init__ header 中的 *args 需要一个星号 (*):

class AddCrimeForm(forms.Form):

    tests = forms.<b>MultipleChoiceField</b>()

    def __init__(self, testList, <b>*args</b>, **kwargs):
        self.testList = testList
        super(AddCrimeForm,self).__init__(*args, **kwargs)  # testList not in args!
        self.fields['tests'].widget = forms.CheckboxSelectMultiple()
        self.fields['tests'].choices = self.testList

您可能还想将表单设为 MultipleChoiceField [Django-doc]如果您想选择多个选项。

在您看来,您应该构造一个 AddCrimeForm,其中 列表作为 第一个 元素,因为它被定义为第一个元素在您的 AddCrimeForm 中:

def add_crime(request):
        values = [('1','um'),('2','dois'),('3','tres')]
        if request.method == 'POST':
            form = AddCrimeForm(<b>values, </b>request.POST)
            if form.is_valid():
                # do stuff
                return redirect('show_crime')
        else:
            form = AddCrimeForm(<b>values</b>)
        return render(request, 'add_crime.html', {'form': form})

除非您想处理表单中的查询字符串,否则通常不会将 request.GET 传递给表单,否则它将采用在查询字符串。

关于Django:forms.ChoiceField,覆盖表单 __init__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53190973/

相关文章:

django - 如何在 django rest 框架模型中创建 created_by 字段?

python - 收到 ValueError : Unknown level when running GoogleScraper

类 Django 框架模式

python - 如何根据列值的长度过滤数据框行

python-3.x - 我还可以使用哪些方法来提取图像中的有效补丁?

javascript - 不要从 django 表单打印媒体

python - 在 Django 中的 URL 反向中使用 request.META.get ('HTTP_REFERER' )

python - django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist 通过测试 django 形式

python - Mac osx Django PIL 错误/usr/bin/cc 重新安装时出现文件错误

python - Django ManyToMany疑问