向Django数据库发布dateTime对象时处理多值DictKeyError

2024-09-28 01:29:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Django数据库上发布两个DateTime对象

型号.py

class Timesheet(models.Model):
    task_id = models.AutoField(primary_key=True)
    project = models.ForeignKey('Project', on_delete=models.CASCADE)
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    task_title = models.CharField(max_length=250)
    task_description = models.TextField(null=True)
    PRIORITY_STATUS = [
        ('H','High'),
        ('M','Medium'),
        ('L','Low'),
    ]
    priority = models.CharField(max_length=1, choices=PRIORITY_STATUS)
    starting_time = models.DateTimeField()
    ending_time = models.DateTimeField()

    def __str__(self):
        return str(self.task_title)

    class timeSheetForm(ModelForm):
        class Meta:
            model=Timesheet
            fields=['project','user','task_title','task_description','priority','starting_time','ending_time']

forms.py:


class timeSheetForm(forms.Form):
    #other fields
    starting_time = forms.DateTimeField(widget=AdminSplitDateTime())
    ending_time = forms.DateTimeField(widget=AdminSplitDateTime())

views.py:

def memberDash(request):
    if request.method == 'POST':
        newTimeSheet = Timesheet()
        newTimeSheet.project = Project.objects.get(pk=request.POST["project"])
        newTimeSheet.user =  User.objects.get(pk=request.POST["user"])
        newTimeSheet.task_title = request.POST["task_title"]
        newTimeSheet.task_description = request.POST["task_description"]
        newTimeSheet.priority = request.POST["priority"]
        newTimeSheet.starting_time = request.POST["starting_time"]
        newTimeSheet.ending_time = request.POST["ending_time"]

        newTimeSheet.save()

        return render(request,'timeSheetApp/dashboard.html')
    else:
        form = timeSheetForm()
    context={
        'form':form,
    }
    return render(request,'timeSheetApp/dashboard.html',context)

模板

<form action="/memberDashboard/" method="POST">
    {% csrf_token %}
    <label for="starting_time" class="col-lg-1 col-form-label">Start Time</label>
    {{form.starting_time}}
    <label for="ending_time" class="col-lg-1 col-form-label">End Time</label>
    {{form.ending_time}}
    <button type="submit" class="btn btn-primary">                                        
        <strong>Create Time-Sheet</strong>
    </button>
</form>

在提交此表格时,多值错误被提出,第二双眼睛在这里会有很大帮助,因为我没有得到我在这里缺少的东西。Django的新手,如果发布了一个愚蠢的问题,那么很抱歉

错误日志文件

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/memberDashboard/

Django Version: 2.2
Python Version: 3.7.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'timeSheetApp']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\django\utils\datastructures.py" in __getitem__
  78.             list_ = super().__getitem__(key)

During handling of the above exception ('starting_time'), another exception occurred:

File "C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "E:\TimeSheet\timeSheet\timeSheetApp\views.py" in memberDash
  19.         newTimeSheet.starting_time.date = request.POST["starting_time"].date()

File "C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\django\utils\datastructures.py" in __getitem__
  80.             raise MultiValueDictKeyError(key)

Exception Type: MultiValueDictKeyError at /memberDashboard/
Exception Value: 'starting_time'

谢谢你抽出时间


Tags: djangopyformtasktimemodelsrequestending
2条回答

抱歉,我正在初始化模态类本身,而不是ModalForm。 在视图中,py应为:

newTimeSheet = timeSheetForm()
#inplace of newTimeSheet = TimeSheet()

如果要使用多值小部件,需要使用forms.SplitDateTimeField

from django.forms import SplitDateTimeField

class timeSheetForm(forms.Form):
    #other fields
    starting_time = forms.SplitDateTimeField(widget=AdminSplitDateTime())
    ending_time = forms.SplitDateTimeField(widget=AdminSplitDateTime())

这是因为这个小部件在引擎盖下使用了两个表单小部件,字段需要知道如何将两个小部件值放入一个字段值中,以保存到一个模型字段中。更多信息请参见the documentation

相关问题 更多 >

    热门问题