django - 试图在 MAKEEMIGRATONS 期间运行的表单代码
问题描述
我正在尝试设置在本地运行良好的新网站。
但是,当我部署时,我的一种表单中有一些代码会导致问题:
class ProfileForm(forms.ModelForm):
first_name = forms.CharField(max_length=60)
last_name = forms.CharField(max_length=100)
address1 = forms.CharField(max_length=200)
address2 = forms.CharField(max_length=200)
city = forms.CharField(max_length=100)
state = forms.CharField(max_length=100)
zip_code = forms.CharField(max_length=25)
CHOICES = tuple((o.pk, o.name) for o in Allergen.objects.all())
allergens = forms.MultipleChoiceField(choices=CHOICES, required=False)
问题是最后两行。当我尝试进行 MAKEEMIGRATIONS 时,我收到过敏原模型丢失的错误消息。但是,如果我删除这 2 行,则没有问题。
我想,我可以注释掉这些行,然后将它们添加回来。但必须有更好的方法。
如果不尝试运行这些行,我该如何进行 makemigrations?
解决方案
我认为最好不要在类定义中运行查询。除了进行迁移时的问题外,如果添加新的元组或从数据库中删除一些元组,则不会更新元组。因此,在处理定义类的文件时(通常是在启动 Web 服务器时)运行一次查询,然后使用该值。Allergen
Allergen
您可以使用ModelMultipleChoiceField
[Django-doc]并使用queryset=…
参数 [Django-doc]来获取项目:
class ProfileForm(forms.ModelForm):
first_name = forms.CharField(max_length=60)
last_name = forms.CharField(max_length=100)
address1 = forms.CharField(max_length=200)
address2 = forms.CharField(max_length=200)
city = forms.CharField(max_length=100)
state = forms.CharField(max_length=100)
zip_code = forms.CharField(max_length=25)
allergens = forms.ModelMultipleChoiceField(
queryset=Allergen.objects.all(),
required=False
)
这不仅会推迟对象的检索,而且您的表单字段将“理解”模型对象的概念,从而有一种“更丰富”的方式来处理数据。
为了显示正确的名称,您可能必须将模型的__str__
方法更新Allergen
为:
class Allergen(models.Model):
# …
def __str__(self):
return self.name