gpt4 book ai didi

Django 陈旧模型对象和表单 ChoiceField 与 ModelChoiceField

转载 作者:行者123 更新时间:2023-12-04 04:42:46 24 4
gpt4 key购买 nike

这只是让我感到困扰的好奇心。我创建了一个 Form 类来处理从数据库中选择的文档。自然,必须从数据库中获取文档列表以填充可用选项。我通过手动构建选择和使用 ChoiceField 获得“陈旧”行为。但是在使用 ModelChoiceField 选项“queryset”时我得到了准确的结果。

“陈旧”我的意思是,如果我上传一个新文档并呈现页面,则列表仅显示旧文档集(有时即使在刷新页面后仍然存在,根据 View 逻辑应该重新生成表单——证明这是无论用例如何,第二种方法都能按预期工作的事实)。
示例如下:

陈旧版本:

class GetDocumentForm(forms.Form):
document_query = Document.objects.all().order_by('docfile')
document_choices = []

for document in document_query:
document_choices.append((document.id, document.docfile.name))

document = forms.ChoiceField(label='', choices=document_choices)

准确版本:
class GetDocumentForm(forms.Form):
document = forms.ModelChoiceField(queryset=Document.objects.all())

是什么赋予了?有什么不同?为什么他们的行为不同?

最佳答案

the stale version class body should be inside __init__ method! – mariodev



谢谢马里奥德夫。

遵循这条线索,我能够生成正常运行的代码。我的第一次尝试仍然无法正常工作:
class GetDocumentForm(forms.Form):
def __init__(self):
...
self.base_fields['document'].choices = self.document_choices[:]

这将允许我创建一个表单,但是当我尝试渲染时:
In [1]: from WebSite.forms import *

In [2]: doc_form = GetDocumentForm()

In [3]: print doc_form.as_p()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)

AttributeError: 'GetDocumentForm' object has no attribute '_errors'

解决方法在这里: StackOverflow -- Django: Overloading init for Custom Forms .你需要 super 类。

最后,工作代码:
class GetDocumentForm(forms.Form):
document = forms.ChoiceField()

def __init__(self, *args, **kwargs):
super(GetDocumentForm, self).__init__(*args, **kwargs)

for doc in Document.objects.all().order_by('docfile'):
self.fields['document'].choices.append((doc.id, doc.docfile.name))

明显使用 ModelChoiceField(queryset=Document.objects.all())更简洁。但关键是要了解如何让它以两种方式工作。

干杯。

关于Django 陈旧模型对象和表单 ChoiceField 与 ModelChoiceField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18648909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com