Django ModelChoiceField 和日期:match = date_re.match(value)
Django ModelChoiceField and date: match = date_re.match(value)
我有一个表格,我想在其中保存一个日期,该日期是从其他模型动态生成的,其中存储了所有可用日期。
尝试保存日期时出现问题:我收到错误 "TypeError at /form/ expected string or buffer"。
我无法理解,因为在 "POST" 中我得到的是字符串,模型的对象表示也是字符串:
我的模特:
class OrderPickUp(models.Model):
name = models.CharField(max_length=128)
pick_up_date = models.DateField(auto_now=False, auto_now_add=False)
class AvailableDates(models.Model):
city_A = models.DateField(auto_now=False, auto_now_add=False)
def __str__(self):
return str(self.city_A)
froms.py
class OrderPickUpForm(forms.ModelForm):
def __init__ (self, *args, **kwargs):
super(OrderPickUpForm, self).__init__(*args, **kwargs)
self.fields["pick_up_date"] = forms.ModelChoiceField(queryset=AvailableDates.objects.all())
class Meta:
model = OrderPickUp
fields = ['name', 'pick_up_date']
views.py
def pick_up(request):
form = OrderPickUpForm()
if request.POST:
form = OrderPickUpForm(request.POST)
if form.is_valid():
form.save()
context = {
"title":"thanks for ordering",
}
else:
context = {
"title":"Something missing",
}
else:
context = {
"form": form,
}
return render(request, "form.html", context)
但是当我提交表单时出现错误:
Traceback:
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/marius/developer/TUTORIALS/PLAYS/testavimai/datos/views.py" in pick_up
12. if form.is_valid():
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/forms.py" in is_valid
184. return self.is_bound and not self.errors
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/forms.py" in errors
176. self.full_clean()
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/forms.py" in full_clean
394. self._post_clean()
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/models.py" in _post_clean
430. self.instance.full_clean(exclude=exclude, validate_unique=False)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/base.py" in full_clean
1149. self.clean_fields(exclude=exclude)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/base.py" in clean_fields
1191. setattr(self, f.attname, f.clean(raw_value, self))
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/fields/__init__.py" in clean
587. value = self.to_python(value)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/fields/__init__.py" in to_python
1274. parsed = parse_date(value)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/utils/dateparse.py" in parse_date
60. match = date_re.match(value)
Exception Type: TypeError at /form/
Exception Value: expected string or buffer
有什么想法吗??
我认为您在表单和模型定义方面存在差异。您在 OrderPickUp
模型中将 pick_up_date
定义为 DateField
,但在您的表单中将其设为 ModelChoiceField
,用于外键类型的字段。如果你想要从 pick_up_date
列表中 select,你应该将你的模型修改为:
class OrderPickUp(models.Model):
name = models.CharField(max_length=128)
pick_up_date = models.ForeighKey('AvailableDates')
请注意,最好使用单数名称而不是复数名称,因此您可能需要将 AvailableDates
更改为 AvailableDate
。
我有一个表格,我想在其中保存一个日期,该日期是从其他模型动态生成的,其中存储了所有可用日期。
尝试保存日期时出现问题:我收到错误 "TypeError at /form/ expected string or buffer"。
我无法理解,因为在 "POST" 中我得到的是字符串,模型的对象表示也是字符串:
我的模特:
class OrderPickUp(models.Model):
name = models.CharField(max_length=128)
pick_up_date = models.DateField(auto_now=False, auto_now_add=False)
class AvailableDates(models.Model):
city_A = models.DateField(auto_now=False, auto_now_add=False)
def __str__(self):
return str(self.city_A)
froms.py
class OrderPickUpForm(forms.ModelForm):
def __init__ (self, *args, **kwargs):
super(OrderPickUpForm, self).__init__(*args, **kwargs)
self.fields["pick_up_date"] = forms.ModelChoiceField(queryset=AvailableDates.objects.all())
class Meta:
model = OrderPickUp
fields = ['name', 'pick_up_date']
views.py
def pick_up(request):
form = OrderPickUpForm()
if request.POST:
form = OrderPickUpForm(request.POST)
if form.is_valid():
form.save()
context = {
"title":"thanks for ordering",
}
else:
context = {
"title":"Something missing",
}
else:
context = {
"form": form,
}
return render(request, "form.html", context)
但是当我提交表单时出现错误:
Traceback:
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/marius/developer/TUTORIALS/PLAYS/testavimai/datos/views.py" in pick_up
12. if form.is_valid():
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/forms.py" in is_valid
184. return self.is_bound and not self.errors
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/forms.py" in errors
176. self.full_clean()
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/forms.py" in full_clean
394. self._post_clean()
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/forms/models.py" in _post_clean
430. self.instance.full_clean(exclude=exclude, validate_unique=False)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/base.py" in full_clean
1149. self.clean_fields(exclude=exclude)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/base.py" in clean_fields
1191. setattr(self, f.attname, f.clean(raw_value, self))
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/fields/__init__.py" in clean
587. value = self.to_python(value)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/db/models/fields/__init__.py" in to_python
1274. parsed = parse_date(value)
File "/Users/marius/.venvs/plays/lib/python3.4/site-packages/django/utils/dateparse.py" in parse_date
60. match = date_re.match(value)
Exception Type: TypeError at /form/
Exception Value: expected string or buffer
有什么想法吗??
我认为您在表单和模型定义方面存在差异。您在 OrderPickUp
模型中将 pick_up_date
定义为 DateField
,但在您的表单中将其设为 ModelChoiceField
,用于外键类型的字段。如果你想要从 pick_up_date
列表中 select,你应该将你的模型修改为:
class OrderPickUp(models.Model):
name = models.CharField(max_length=128)
pick_up_date = models.ForeighKey('AvailableDates')
请注意,最好使用单数名称而不是复数名称,因此您可能需要将 AvailableDates
更改为 AvailableDate
。