Modelchoicefield 查询集混淆
Posted
技术标签:
【中文标题】Modelchoicefield 查询集混淆【英文标题】:Modelchoicefield Queryset Confusion 【发布时间】:2018-02-01 19:30:48 【问题描述】:全部,
我是 Django 的新手,到目前为止一直做得很好,但这个让我很难过。我正在尝试将 ModelChoiceField 用于许多具有相同名称的记录。我正在使用 Postgresql,所以我能够确定我需要使用 distinct 命令,并且运行良好。我的下拉列表中的记录都被精简为每个记录的一个版本。但是,当我尝试获取特定记录的所有版本时,这就是我迷路的地方。如果我不通过 DetailView 使用 distinct,我可以获取每条记录的详细信息,但我真的想在 modelchoicefield 之后在屏幕上获取每条记录的所有版本。
这是我的表格:
class History(forms.Form):
dropdown = forms.ModelChoiceField(queryset=History.objects.all())
def __init__(self, user, *args, **kwargs):
super(History, self).__init__(*args, **kwargs)
self.fields['dropdown'].widget.attrs['class'] = 'choices1'
self.fields['dropdown'].empty_label = ''
qs = History.objects.all().distinct('record_name')
self.fields['dropdown'].queryset = qs
我最终试图通过我的模板在屏幕上查看查询集。我在模板中尝试了几种不同版本的代码,但似乎没有任何效果。如果我使用没有不同的 CBV DetailView,我可以很好地获取所有记录及其详细视图。然而,这不是我想要做的。我已经在模板中使用了几个版本的 queryset 命令,因为我发现了几个与我的问题相似但似乎无法让它工作的问题。我发现了一些类似的参考:
% for record in form.history.field.queryset %
etc.
% endfor %
但似乎无法让它在我的 Django 模板中工作。任何和所有的帮助表示赞赏!提前谢谢!
【问题讨论】:
如果我理解你的问题,那么它即将显示取决于你的下拉框的当前值的数据记录? @Max M 是的,这就是我想要做的,获取用户从下拉框中选择的值,然后在下一个屏幕上显示所有具有相同名称的记录。 【参考方案1】:在这种情况下,我会建议
a) 将下拉字段的值放入您的网址匹配中。 See the django docs for named groups in URL。此外,您可以将onchange
事件添加到重定向到<current url>/<value of dropdown>
的下拉字段中,或者只需更改链接到下一页的按钮的值(如果存在)。 注意:使用此解决方案,您必须确保下拉字段的值与 url-format (django's slugify might be useful for this) 匹配。
或
b) 将下拉字段添加到输入表单或作为输入字段。然后您可以使用以下方法提取下拉列表的值:
try:
dropdown_value = request.POST['dropdown-field-name'] # dict-error if field is not in request.POST
except:
# some error actions
然后您可以将此值作为过滤器添加到您的查询集:
def get_queryset(self, dropdown_value=None):
# ...
qs = qs.filter('field-name' = dropdown_value) # possibly no/wrong results if dropdown_value is corrupted or manipulated
【讨论】:
@ Max M..谢谢你帮助我。我将尝试这些示例,看看会发生什么。在审查您的建议时,它们比我的想法要先进一些。例如,如果下拉列表中有 A、B 和 C……我希望让用户选择其中一个并单击提交。然后下一个屏幕将是 A 的所有版本的列表(假设用户选择了 A)。我用 CB 列表视图尝试了这个,但得到了整个列表。除了您建议的方法之外,还有其他方法可以获取 A 条目的列表吗?还是因为查询集而无法实现? 检查this question。它可能会给出您正在寻找的答案 - 或者您可以将其与我的建议之一混合使用。 不幸的是,上述建议似乎都没有帮助。我偶然发现了 ModelChoiceField 的 to_field_name 选项,它本质上是在下拉列表中给了我记录的名称,但我似乎无法弄清楚如何在下一个屏幕上获取所有具有相同名称的记录。当我删除 distinct 时,我可以单独获取它们,但这不是我想要做的。我基本上只想获取具有相同名称的记录的“列表”,然后单击并获取详细信息。我似乎能够获得整个列表,但不能获得我正在寻找的子集。还有其他想法吗?以上是关于Modelchoicefield 查询集混淆的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ModelChoiceField 中使用多个查询集?
Django - ModelChoiceField 查询集如何工作?
Django:让 ModelChoiceField 在运行时评估查询集