CharField中的最新值

时间:2015-05-15 12:12:25

标签: django forms select

我有一些模特

class Mod(Model):      
    f = CharField(max_length=10)

以某种形式:

class ModForm(ModelForm):
    class Meta:
        model = Mod
        fields = ('f',)

当我向用户显示表单时,我想用Mod.objects.all()值'f'建议一些下拉列表。如何以最简单的方式做到这一点?我尝试指定小部件= {'f':选择},但它不可编辑。我也可以使用selectize.js通过预加载ajax值来选择它,但看起来这样做太长了。

2 个答案:

答案 0 :(得分:1)

models.py

class Mod(models.Model):
  CHOICE_1 = 'CHOICE 1'
  CHOICE_2 = 'CHOICE 2'
  FIELD_CHOICES = (
    (CHOICE_1, 'The real charfield value'),
    (CHOICE_2, 'another charfield value')
  )
  f = models.CharField(
    max_length=10,
    choices=FIELD_CHOICES,
    default=CHOICE_1
  )

forms.py

class ModForm(ModelForm):
    class Meta:
        model = Mod
        fields = ('f',)

views.py

的结尾
return render(request, 'template.html', context={'mod_form': mod_form})

template.html

{{mod_form.as_p}}

这是从工作代码中提取的。希望混淆我的特定应用程序并不清楚。

答案 1 :(得分:0)

自动填充是一个简单而又好的解决方案。感谢Bilou06。 所以,首先我们需要传递值列表,我们可以在视图中执行:

args['f_vals'] = Mod.objects.all().values_list("f", flat=True).distinct()[:10]

这里我们得到所有值的平面列表并执行distinct以仅过滤uniq值。然后我们将值限制为10.这里的另一个好处是我们可以使用额外的过滤等执行更复杂的查询集。例如,如果你有一些字段,你可以命令它是真实的"最近"。 (您可以编辑此答案以提供一些示例)。

接下来,我们将args传递给模板,然后创建autocompleate:

<script>
   $(document).ready(function(){
        $("#id_f").autocomplete({
            source: [{% for v in f_vals %}
                       "{{v}}",
                     {% endfor %}
                    ],
            minLength: 0,
        }).on("focus", function () {
            $(this).autocomplete("search", '');
        }); 
    }
</script>

在焦点事件中,此处显示焦点上的近期值列表。键入时也会过滤值。 请注意,您应该包含jquery-ui:

<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'js/jquery-ui.min.js' %}"></script>