python - Django DateField TypeError 预期的字符串或类似字节的对象
问题描述
我是 Django 新手,在提交并尝试保存在下拉列表之一中选择的更新值时出现错误。
我认为这与传递给表单的日期有关,但我不确定如何解决这个问题。
追溯错误:
match = date_re.match(value)
TypeError:预期的字符串或类似字节的对象
我的模型.py
from django.db import models
class Person(models.Model):
person_name = models.CharField(max_length=50, unique=True)
person_dept = models.ForeignKey('Department',
default='1',
on_delete=models.CASCADE)
number = models.CharField(max_length=10, unique=True)
email = models.EmailField(max_length = 100, unique=True)
class Meta():
db_table = 'person'
def save(self, *args, **kwargs):
for field_name in ['person_name']:
val = getattr(self, field_name, False)
if (val):
setattr(self, field_name, val.title())
super(Person, self).save(*args, **kwargs)
def __str__ (self):
return self.person_name
class Department(models.Model):
dept_desc = models.CharField(max_length=100, unique=True)
class Meta():
db_table = 'dept'
def __str__ (self):
return self.dept_desc
class Roster(models.Model):
roster_date = models.DateField()
oss_person = models.ForeignKey('Person',
on_delete=models.CASCADE,
related_name='+',
limit_choices_to={'person_dept': 1},)
nw_person = models.ForeignKey('Person',
on_delete=models.CASCADE,
related_name='+',
limit_choices_to={'person_dept': 2},)
class Meta():
db_table = 'roster'
def __str__(self):
return str(self.roster_date)
我的表格.py
from datetime import datetime, timedelta
from django import forms
from django.core import validators
from roster.models import Roster, Person, Department
class UpdateRosterForm(forms.ModelForm):
class Meta():
model = Roster
fields = '__all__'
labels = {
"roster_date":"Start On Call Date",
"oss_person":"Servers",
"nw_person":"Networks",
}
def __init__(self, *args, **kwargs):
super(UpdateRosterForm, self).__init__(*args, **kwargs)
self.today = datetime.now()
self.min_date = (self.today - timedelta(days=self.today.weekday())
+ timedelta(days=0)).date()
self.fields['roster_date'] = forms.ModelChoiceField(
queryset=Roster.objects.filter(
roster_date__gte=self.min_date),
initial = 0,
label='Start On Call Date')
def clean(self):
roster_date = self.cleaned_data.get("roster_date")
oss_person = self.cleaned_data.get("oss_person")
nw_person = self.cleaned_data.get("nw_person")
我的模板文件
{% extends "roster/base.html" %}
{% block title %}Update On Call Roster{% endblock %}
{% block extra_js %}
{% load staticfiles %}
<script type="text/javascript" src='{% static "js/roster_selector.js" %}'></script>
{% endblock extra_js %}
{% block body_block %}
<p>
<div class="container">
<form name="status_form" method="POST">
{% include 'roster/messages.html' %}
{% block content %}
{% endblock %}
</form>
</div>
<div class="container">
<table class="table table-bordered table-striped table-dark table-primary">
<colgroup span="3"></colgroup>
<thead>
<th scope="col">On Call Start Date</th>
<th scope="col">Server</th>
<th scope="col">Networks</th>
</thead>
<trbody>
<form method="POST">
<tr>
{% for field in form %}
<td> {{ field }} </td>
{% endfor %}
</tr>
{% csrf_token %}
</trbody>
</table>
<input class="btn btn-primary" type="submit" value="submit">
</div>
{% endblock %}
我的观点.py
def update(request):
form = forms.UpdateRosterForm()
if (request.method == 'POST'):
form = forms.UpdateRosterForm(request.POST)
if (form.is_valid()):
form.save()
form = forms.UpdateRosterForm()
messages.success(request,"Roster Has Been Updated Successfully")
else:
messages.warning(request,"Something Went Wrong!")
return render(request, 'roster/update.html', {'form': form})
def send_selected_date(request):
if (request.method == "GET"):
sel_date = request.GET.get('selected_date')
oncall_ids = Roster.objects.filter(
roster_date = sel_date).values_list('oss_person_id','nw_person_id')
oncall_ids_json = dumps(list(oncall_ids), cls=DjangoJSONEncoder)
return HttpResponse(oncall_ids_json)
追溯
追溯: 内部文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/core/handlers/exception.py” 34. 响应 = get_response(请求) _get_response 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/core/handlers/base.py” 126. 响应 = self.process_exception_by_middleware(e,请求) _get_response 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/core/handlers/base.py” 124.响应=wrapped_callback(请求,*callback_args,**callback_kwargs) 文件 更新中的“/Users/msl/Documents/scripts/django/oncall_roster/roster/views.py” 115. if (form.is_valid()): is_valid 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/forms/forms.py” 185. 返回 self.is_bound 而不是 self.errors 错误中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/forms/forms.py” 180. self.full_clean() full_clean 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/forms/forms.py” 383. self._post_clean() 文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site- _post_clean 中的 packages/django/forms/models.py" 403. self.instance.full_clean(排除=排除, 验证唯一=假) full_clean 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/db/models/base.py” 1130. self.clean_fields(排除=排除) clean_fields 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/db/models/base.py” 1172. setattr (self, f.attname, f.clean(raw_value, self)) 清理文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/db/models/fields/__init__.py” 630. 值 = self.to_python(值) to_python 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/db/models/fields/__init__.py” 1230.解析=解析日期(值) parse_date 中的文件“/Users/msl/Documents/scripts/django/env/lib/python3.6/site-packages/django/utils/dateparse.py” 74. 匹配 = date_re.match(值) 异常类型:/update_roster/ 处的 TypeError 异常值:预期的字符串或类似字节的对象
解决方案
在您的模型中,您有roaster_date 一个DateField,但是您从Form 发送了一个Roaster 对象,这就是您面临这个问题的原因。所以像这样更新表格:
days = self.today - self.min_date
choices = list()
choices.append((self.today, str(self.today)))
new_date = self.today
for i in range(days):
new_date = new_date - datetime.timedelta(days=1)
choices.append((new_date, str(new_date)))
self.fields['roster_date'].widget = forms.Select(choices=choices)
推荐阅读
- javascript - 如何根据另一列值在.JS中的表列中放置条件
- sql - SQL(BigQuery) 使用 lag() 函数连接两个表
- swift - 在更新的 Swift 5 / SwiftUI 2 项目中构建单元测试时出现链接器错误
- css - 如何通过纯 FlexBox 制作用户信息卡
- bluetooth-lowenergy - BLE scan() 未返回完整的广告负载
- html - CSS背景颜色不覆盖数据表样式?
- wordpress - 如何在管理单个产品编辑页面中获取产品类别自定义元字段的值?
- python - 尝试将项目添加到 Django 中的数据库时出现“TypeError”
- matplotlib - 图中仅显示循环中的最后一个图
- java - 铸造泛型类