【问题标题】:How to control Select / Options in Django Forms如何控制 Django 表单中的选择/选项
【发布时间】:2016-04-26 17:29:36
【问题描述】:

使用 Django,我的目标是创建一个带有“选择”字段的表单,并使用 db 表“TestTable”中的值填充该表单。

TestTable的字段有:id、desc1、desck2、desc3、desc4等……

这是我在 form.py 中的代码:

class TestForm(forms.ModelForm):
    field1 = ModelChoiceField(queryset=TestTable.objects.all().order_by('desc1'))
    class Meta(object):
        model = BlockValue
        fields = ()

这是模板:

<html>
<head><title>TEST PAGE</title></head>

<body>
Test: 
{{ form }} 

</body>
</html>

这里是view.py:

def test(request):
    form = TestForm()
    return render(request, 'test.html', {'form': form})

当我渲染表单时,结果是:

<tr><th><label for="id_field1">Field1:</label></th><td><select id="id_field1" name="field1">
<option value="" selected="selected">---------</option>
<option value="1">aaaaaaa</option>
<option value="3">bbbbbbb</option>
<option value="2">ccccccc</option>
</select></td></tr>

选项标签中如何选择打印哪个字段?

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    有两种方法。快速的方法是更改​​ __unicode__ 返回您的 TestTable 以返回您喜欢的字段。但是,您可能只想在当前形式中显示该字段,而不是在其他地方显示,因此并不理想。

    第二个选项,你可以定义你自己的表单域。它继承ModelChoiceField,但覆盖label_from_instance方法:

    class TestTableModelChoiceField(forms.ModelChoiceField):
        def label_from_instance(self, obj):
             # return the field you want to display
             return obj.display_field
    
    class TestForm(forms.ModelForm):
        type = TestTableModelChoiceField(queryset=Property.objects.all().order_by('desc1'))
    

    【讨论】:

    • 谢谢。它完全有效。是否也可以设置&lt;option value="TestTable.id"&gt;
    • 我认为它已经这样做了,这是默认设置。你能仔细检查每个&lt;option&gt;的页面源吗?
    【解决方案2】:
    class TestForm(forms.ModelForm):
        ...
        def __init__(self, *args, **kwargs):
            super(TestForm, self).__init__(*args, **kwargs) # initialize form, which will create self.fields dict
            self.fields['field1'].choices = [(o.id, str(o).upper()) for o in TestTable.objects.all()] # provide a list of tuples [(pk,display_string),(another_pk,display_str),...]
            # display string can be whatever str/unicode you want to show.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 2011-08-10
      相关资源
      最近更新 更多