null value in column "postal_code_id" violates not-null constraint
形式:
def add(request):
if request.method == 'POST':
address_form = AddressForm(request.POST)
company_form = CompanyForm(request.POST)
if address_form.is_valid() and company_form.is_valid():
print address_form.cleaned_data['postal_code'] # <-- prints (<PostalCode: V4N 1K6>, False)
address_form.save() # <------------------------------- occurs here
else:
print 'Address errors',address_form.errors
print 'Company errors', company_form.errors
else:
address_form = AddressForm()
company_form = CompanyForm()
return render(request, 'company/add.html', locals())
顯然形式確實有一個有效的PostalCode
對象,所以我不知道爲什麼它說,它違反了非空約束。當然,我這樣做與形式還挺有趣的東西:
class AddressForm(ModelForm):
postal_code = CharField(max_length=10, validators=[validate_postal_code])
city = CharField(max_length=50, validators=[validate_non_whitespace])
province = CharField(max_length=50, validators=[validate_non_whitespace])
country = CharField(max_length=50, initial='Canada', validators=[validate_non_whitespace])
def clean_postal_code(self):
code = self.cleaned_data['postal_code']
code = code.upper()
code = re.sub('[^A-Z0-9]', '', code)
code = code[:3] + ' ' + code[-3:]
return code
def clean_country(self):
country = self.cleaned_data['country']
try:
country = Country.objects.get(name__iexact=country)
except Country.DoesNotExist:
raise ValidationError('Country does not exist')
return country
def clean_province(self):
province = self.cleaned_data['province']
if not Province.objects.filter(name__iexact=province).exists():
raise ValidationError('Province does not exist')
return province
def clean(self):
data = self.cleaned_data
if 'country' in data and 'province' in data:
try:
data['province'] = Province.objects.get(country=data['country'], name__iexact=data['province'])
if 'city' in data:
data['city'] = City.objects.get_or_create(name__iexact=data['city'], province=data['province'], defaults={'name':data['city']})[0]
if 'postal_code' in data:
data['postal_code'] = PostalCode.objects.get_or_create(code=data['postal_code'], city=data['city'])
except Province.DoesNotExist:
self._errors['province'] = self.error_class(['Province does not exist in that Country'])
del data['province']
return data
class Meta:
exclude = ['postal_code']
model = Address
具體來說,我有一個文本字段替換postal_code
字段,然後我發現/在「乾淨」的方法創建對象。爲什麼會混淆Django?它最終得到了它需要的對象,不是嗎?
哈!輝煌。忘了我已經排除了'postal_code'。那,我需要一個'[0]'在'PostalCode.objects.get_or_create'(它返回一個元組)。刪除排除修復它,但做它的「小部件」,而不是導致此錯誤「CharField」對象沒有屬性「value_from_datadict''而是。你知道這是爲什麼嗎? – mpen 2011-06-11 03:04:48
@mark對不起,我沒有清楚地閱讀你的問題。由於postal_code是一個外鍵,當它試圖將POST數據轉換爲表單中的字段時,該字段需要一個id(不是文本字段)。這就是它失敗的原因。之前我必須處理這個問題,最簡單的方法是定義自己的自定義表單(不是模型表單),並自己處理保存方法。你沒有太多的領域,所以它不應該太難。 – 2011-06-11 03:36:18
Hrm ...我現在要繼續這樣做(覆蓋該領域),但如果這變得有問題,我會記住這一點。謝謝! – mpen 2011-06-11 05:51:42