过滤表单上的外键并使用下拉菜单显示该值

时间:2017-09-18 18:38:58

标签: django

我遇到显示相关表格值的问题。它会告诉我table object。当我尝试检索它时,我得到了表值本身,但是我无法获得外表值。

form.py

class MyForm(forms.ModelForm):
    name = forms.CharField(label='Whatever Name')

    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(MyForm, self).__init__(*args, **kwargs)
        qs = ForeignTable.objects.filter(user=user, status="Y") | ForeignTable.objects.filter(rel_user=user, status="Y") 
        self.fields['dropdown'].queryset = qs #the user id can be one column or a rel_user column

此输出是一个下拉菜单,但它显示ForeignTable object。然后使用外键将此ForeignTable连接到UserTable。这是我被困的地方。我无法显示列表。所以我尝试了qs=[(o.id, str(o.user.username)) for o in qs]。在打印时,我可以看到我的用户名。但是在打印list object has no attribute all后它会出错。所以我查看了模板。

template.html {{ form.as_ul}}这就是我所拥有的,然后我改变以查看下拉列表中的内容我正在寻找{{form.dropdown }}。它给了我同样的错误。所以现在我不知道接下来要去哪里看。它所说的all在哪里?

1 个答案:

答案 0 :(得分:0)

最简单的方法是在模型上定义__unicode__方法,以更可读的方式表示模型对象,而不是当前显示的ForeignTable object,执行以下操作:

class ForeignTable(models.Model):
    # ...
    def __unicode__(self):
        user = self.user or self.rel_user
        return user.username

另一种方法是定义自定义ModelChoiceField,您可以在其中更改查询集对象的显示内容:

class CustomModelChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        user = obj.user or obj.rel_user
        return user.username

class MyForm(forms.ModelForm):
    dropdown = CustomModelChoiceField(queryset=ForeignTable.objects.none())
    # other fields