【问题标题】:Adding 'all' value to a foreign key form field based on model?将“全部”值添加到基于模型的外键表单字段?
【发布时间】:2014-08-06 02:15:10
【问题描述】:

我正在为我的网站构建一个过滤器,人们可以在其中按美食进行过滤。为了实现这一点,我使用模型表单来接收输入信息,这些信息在我的视图中的查询中设置过滤器变量。但是,正如您在下面链接的图片中看到的那样,我的美食类别的默认选择是 '-------'。

我将如何更改它以说出“全部”一词并设置一个值,以便我的过滤器查询这些类别的所有内容?我认为这与使用表单方法有关,但我无法理解某些示例中实际发生的情况。

这是我的简单代码

型号

class Cuisine(models.Model):
    name = models.CharField()

    def __str__(self):
        return self.name

class Food(models.Model):
    name = models.CharField()
    cuisine = models.ForeignKey(Cuisine)

    def __str__(self):
        return self.name

观看次数

def home_page(request):
    if request.method == 'GET':
        form = FilterForm(request.GET)
        if form.is_valid():
            cuisine = form.cleaned_data['cuisine']
            food = get_list_or_404(Food, cuisine__pk=cuisine.pk)
            return render('base.html', {'food': food, 'form':form})
    else:
        form = FilterForm()
    return render('base.html', {'form':form})

表格

class FilterForm(forms.ModelForm):
    class Meta:
        model = Cuisine
        fields = ('name')

【问题讨论】:

  • 这似乎不是您的实际代码。美食没有选择字段,因此表单不会使用下拉菜单呈现。
  • 对不起,你是对的,这个屏幕截图来自我的旧代码,我的旧东西有点脏。我需要重新添加它。 编辑:刚刚检查了我的旧代码,这实际上正是我所拥有的,除了在表格中,模型设置为食物。它确实呈现了选择下拉菜单。
  • 对,Food 模型会呈现一个下拉菜单,因为它有一个外键。请您更新代码。

标签: python django forms filter


【解决方案1】:

我不会在这里使用模型表单。您只有一个字段,并且您没有使用它来创建或编辑 Food 或 Cuisine 的实例。使用带有 ModelChoiceField 的手动表单会更简单,您可以将 empty_label 参数传递给该表单。

class FilterForm(forms.Form):
    cuisine = forms.ModelChoiceField(queryset=Cuisine.objects.all(),
                                     empty_label="All")

(请注意,您也可以使用 ModelForm 来执行此操作,但这只会使其变得更加毫无意义,因为您现在没有使用任何 ModelForm 功能。)

【讨论】:

  • 非常感谢,我完全明白你的意思。如果我要添加或编辑实例,我应该只使用 modelform。我没有意识到在我所有的菜系中添加一个多选字段是如此容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2011-10-13
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多