1

我想创建一个表单,当查看时,从数据库中查询用户最喜欢的水果并显示如下:

<select size="4"> 
<option selected>Apples</option>
<option>Bananas</option> 
<option>Oranges</option>
<option>Watermelon</option> 
</select>

使用该表单的视图将:

  1. 获取用户对象。
  2. 在数据库中查询用户最喜欢的水果。(每个都是 Fruit 模型的一个单独对象。)
  3. 将 (2) 中收集的水果选项加载到表单中。

我正在考虑使用 ChoiceField,但看起来您无法将选项列表动态加载到表单中,至少以简单的方式。我最好跳过表单并直接在模板上生成代码吗?或者有没有办法在视图中加载表单的 ChoiceField 和用户项?

此外,是否有任何一般的经验法则规定使用 django 表单字段构建表单与在模板中生成表单代码更容易?

4

3 回答 3

5

我在这个堆栈溢出主题中找到了答案。诀窍是覆盖表单__init__(),以便它接受一个新的关键字参数,在这种情况下是用户。

views.py 片段

context = RequestContext(request)
user = User.objects.get(username=context['user'])
form = forms.FruitForm(user=user)

forms.py 片段

from django import forms

class FruitForm(forms.Form):
    fruits = forms.ModelChoiceField(queryset=Fruit.objects.all())

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(FruitForm, self).__init__(*args, **kwargs)
        if user:
            self.fields['fruits'].queryset = Fruit.objects.filter(user=user)
于 2012-06-17T14:37:06.630 回答
0

创建将在您的视图中使用的FormModelForm 。这两个类之间的区别在于它们的ModelForm构建非常类似于models.py文件中定义的数据库模型,其中Form可以具有自定义属性。

from django.forms import ModelForm
class FruitForm(ModelForm):
    class Meta:
        model = User
        fields = ('favorite-fruits', )
于 2012-06-16T06:14:46.277 回答
0

这并不难。您可以使用模型表单轻松完成此操作。

请参阅:https ://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Django 框架的优势之一是它的表单处理和验证方法。因此,如果可能,最好使用 Django 表单或模型表单。

于 2012-06-16T05:42:03.990 回答