模型表单额外字段

0 投票
1 回答
1013 浏览
提问于 2025-04-16 12:44

我在一个表单里通过模型添加了一个额外的字段,并且使用了这些选项:

A_CHOICES = (
    ('none', 'none'),
    # further conversion table

class MyForm(ModelForm):

extra_field_a = ChoiceField(choices=A_CHOICES)

如果这个字段的值不是'none',我想把它的值用在模型的一个字段里,但我不太确定怎么获取这个值。我在MyForm里试过:

def cleaned_extra(self):
    if(self.cleaned_data.get('extra_field_a') != 'none'):
        return self.extra_field_a
    else:
        return self.original_field

但是我遇到了一个NameError,提示'global name not defined'。希望能得到一些帮助。

亚当

1 个回答

1

这正是你获取它的方式。虽然语法看起来有点奇怪,但NameError在哪里呢?self未定义?你把这段代码放在哪里了?

通常,这种特定字段的代码会放在clean_FOO方法里。http://docs.djangoproject.com/en/dev/ref/forms/validation/#form-and-field-validation

def clean_extra_field_a(self):
    data = self.cleaned_data.get('extra_field_a')
    if data != 'none':
        return data
    return None # remember to set this field as required=False

def save(self, *args, **kwargs):
    # override save to do something with your extra field.
    self.instance.myfield = self.cleaned_data.get('extra_field_a')
    super(MyForm).save(*args, **kwargs)

更新:在视图中保存没有问题。

mymodel = myform.save(commit=False) 
# ModelForm's will return the object being created/edited on save()
# commit=False will prevent a database save

mymodel.myfield = myform.cleaned_data.get('extra_field_a')
mymodel.save()

# note if you have an m2m, there is an extra method to call on commit=False

撰写回答