【问题标题】:Why my form.py can't read field HEIGHT from models?为什么我的 form.py 无法从模型中读取字段 HEIGHT?
【发布时间】:2021-06-14 20:05:24
【问题描述】:

我正在尝试运行我的应用程序,但出现此错误:

NameError: name 'HEIGHT' is not defined

这是我的models.py:

from django.db import models
from django.forms import ModelForm

HEIGHT = [
    ('XS', 'Extra Small'),
    ('S', 'Small'),
    ('M', 'Medium'),
    ('L', 'Large'),
    ('XL', 'Extra Large')]class Dog(models.Model):

class Dog(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField(null=False)
    weight = models.IntegerField(null=False)
    height = models.CharField(max_length=2, choices=HEIGHT, null=False)

class DogForm(ModelForm):
    class Meta:
        model = Dog
        fields = ['name', 'age', 'weight', 'height']

这是我的forms.py:

from django import forms

class DogForm(forms.Form):
    name = forms.CharField(max_length=20)
    age = forms.IntegerField()
    weight= forms.IntegerField()
    height = forms.CharField(max_length=2, widget=forms.Select(choices=HEIGHT))

我做错了什么?

【问题讨论】:

  • 你在forms.py中声明了HEIGHT
  • 这是什么...??? ('XL', 'Extra Large')]class Dog(models.Model):如有错误请更正问题。

标签: python django forms model


【解决方案1】:

我建议将高度选项移动到模型中,这样您就不必记住每次要使用它时都要导入它。您也可以使用 Django 内置的 models.TextChoices。

from django.db import models
from django.forms import ModelForm

class Dog(models.Model):
    class Height(models.TextChoices):
        XS = 'XS', 'Extra Small'
        S =  'S', 'Small'
        M = 'M', 'Medium'
        L = 'L', 'Large'
        XL = 'XL', 'Extra Large'
        
    name = models.CharField(max_length=20)
    age = models.IntegerField(null=False)
    weight = models.IntegerField(null=False)
    height = models.CharField(max_length=2, choices=Height.choices, null=False)

class DogForm(ModelForm):
    class Meta:
        model = Dog
        fields = ['name', 'age', 'weight', 'height']

现在,只要您想在 models.py 之外访问 Height,您只需 from [app].models import Dog,然后就可以在 Dog.Height 下访问它。使用models.TextChoices 让您可以更轻松地访问每个选项的名称、值和标签。例如:

Dog.Height.XL.value == 'XL' # True
Dog.Height.XL.label == 'Extra Large' # True

【讨论】:

    【解决方案2】:

    试试这个

    from django import forms
    from myapp.models import HEIGHT
    
    class DogForm(forms.Form):
        name = forms.CharField(max_length=20)
        age = forms.IntegerField()
        weight= forms.IntegerField()
        height = forms.CharField(max_length=2, widget=forms.Select(choices=HEIGHT))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多