我想了解此问题的最佳实践。
我有一个 Django 表单,其中包含以下内容:
class AdvancedSearchForm(forms.Form):
CATEGORY_OPTIONS = Category.objects.all().order_by('parent_id','primary')
categoryAS = forms.ChoiceField(
widget = forms.Select(attrs={'class': 'form-control',
'onchange' : 'changeCategory("id_categoryAS");'}),
label = '',
required = False,
choices = ((x.id, x.primary) for x in CATEGORY_OPTIONS),
)
如果这是第一个makemigrations
我运行的项目总是发现我收到一条错误消息告诉我Cateogry.parent_id
不存在。为了运行它,我需要注释掉选择行,运行makemigrations
and migrate
然后取消注释选择行。
这是标准做法还是我应该遵循什么做法以确保它第一次起作用。
Thanks
在 Django 1.8+ 中,您可以使用可调用选项。
def get_choices():
return ((x.id, x.primary) for x in AdvancedSearchForm.CATEGORY_OPTIONS),
class AdvancedSearchForm(forms.Form):
CATEGORY_OPTIONS = Category.objects.all().order_by('parent_id','primary')
categoryAS = forms.ChoiceField(choices=get_choices)
The get_choices
方法在视图中创建表单时运行,而不是在加载模块时运行。这意味着您在运行初始迁移时不会遇到任何问题。
有时,可以使用ModelChoice
代替ChoiceField
。在表单初始化之前不会评估查询集,因此在运行初始迁移时不会遇到任何问题。
class AdvancedSearchForm(forms.Form):
CATEGORY_OPTIONS = Category.objects.all()
categoryAS = forms.ModelChoiceForm(choices=CATEGORY_OPTIONS)
您甚至可以通过子类化并覆盖来自定义模型选择字段的标签label_from_instance
.
from django import forms
class MyModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return self.primary
class AdvancedSearchForm(forms.Form):
CATEGORY_OPTIONS = Category.objects.all()
categoryAS = MyModelChoiceForm(choices=CATEGORY_OPTIONS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)