【问题标题】:int() argument must be a string, a bytes-like object or a number, not 'QueryDict'int() 参数必须是字符串、类似字节的对象或数字,而不是 'QueryDict'
【发布时间】:2019-12-26 19:48:15
【问题描述】:

最近,当我单击提交以及默认用户外键时,我试图将数据保存到我的数据库中。但是我被这个错误困住了,并试图通过在网上查看来解决,但找不到任何类似的问题。

我的意见.py

from django.shortcuts import render,redirect
from .models import TimesheetDetails
from django.contrib.auth.decorators import login_required

# Create your views here.
@login_required(login_url="/login")
def create_timesheet_view(request):
    if request.method=="POST":
        print(request.POST)
        if ('dateToday' and 'dayToday' and 'startTime' and 'endTime' and
            'breakTime' and 'weekType' and 'attendance' and 'normalTime' and 'extraTime'
            and 'holidayTime' and 'workContent') in request.POST:
            #post.user = request.POST.get('user')
            post = TimesheetDetails()
            post.username = request.POST.get('username')
            post.date = request.POST.get('dateToday')
            post.day = request.POST.get('dayToday')
            post.startTime = request.POST.get('startTime')
            post.endTime = request.POST.get('endTime')
            post.breakTime = request.POST.get('breakTime')
            post.normalTime = request.POST.get('normalTime')
            post.overTime = request.POST.get('extraTime')
            post.holidayTime = request.POST.get('holidayTime')
            post.weekType = request.POST.get('weekType')
            post.attendance = request.POST.get('attendance')
            post.content = request.POST.get('workContent')
            post = TimesheetDetails(request.POST,request.FILES)
            print (request.POST)
            instance  = post.save()
            instance.user = request.user
            instance.save()
            return redirect('/list')        
    return render(request,'timesheet/create_timesheet.html')

def view_timesheet(request):
    context = {'timesheet_list': TimesheetDetails.obejcts.all()}
    return render(request,"timesheet/view_timesheet.html")

我的模型.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class TimesheetDetails(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,related_name="timesheet",null="False")
    date = models.CharField(max_length = 10)
    day = models.CharField(max_length = 10)
    startTime = models.CharField(max_length =10)
    endTime = models.CharField(max_length =10)
    breakTime = models.CharField(max_length=3)
    normalTime = models.CharField(max_length=10)
    overTime = models.CharField(max_length = 10)
    holidayTime = models.CharField(max_length = 10)
    weekType = models.CharField( max_length = 10)
    attendance = models.CharField( max_length = 10)
    content = models.TextField( max_length = 300)

我的错误

任何帮助将不胜感激。上次尝试没有外键,我能够保存数据。但我希望特定用户保存他的数据并仅查看他的数据。

TypeError at /
int() argument must be a string, a bytes-like object or a number, not 'QueryDict'
Request Method: POST
Request URL:    http://127.0.0.1:8000/
Django Version: 2.2.8
Exception Type: TypeError
Exception Value:    
int() argument must be a string, a bytes-like object or a number, not 'QueryDict'
Exception Location: D:\Django\TimeSheetProject\morabu\lib\site-packages\django\db\models\fields\__init__.py in get_prep_value, line 972
Python Executable:  D:\Django\TimeSheetProject\morabu\Scripts\python.exe
Python Version: 3.7.2
Python Path:    
['D:\\Django\\TimeSheetProject',
 'D:\\Django\\TimeSheetProject\\morabu\\Scripts\\python37.zip',
 'D:\\Django\\TimeSheetProject\\morabu\\DLLs',
 'D:\\Django\\TimeSheetProject\\morabu\\lib',
 'D:\\Django\\TimeSheetProject\\morabu\\Scripts',
 'c:\\program files\\python\\Lib',
 'c:\\program files\\python\\DLLs',
 'D:\\Django\\TimeSheetProject\\morabu',
 'D:\\Django\\TimeSheetProject\\morabu\\lib\\site-packages']
Server time:    Fri, 27 Dec 2019 04:35:51 +0900

【问题讨论】:

  • TimesheetDetails 不是 Form,所以post = TimesheetDetails(request.POST,request.FILES) 没有意义。

标签: python django


【解决方案1】:

您需要删除post = TimesheetDetails(request.POST,request.FILES) 行,因为TimesheetDetails 不是 Form。话虽如此,work with forms 可能会更好。

另一个问题是'foo' and 'bar' in request.POST 只会检查'bar' 是否在request.POST 中,因为它只会评估'foo' 的真实性,并且非空字符串将True 视为真实性。

@login_required(login_url="/login")
def create_timesheet_view(request):
    if request.method=="POST":
        print(request.POST)
        if all(x in request.POST for x in ('dateToday', 'dayToday', 'startTime', 'endTime', 'breakTime', 'weekType', 'attendance', 'normalTime', 'extraTime', 'holidayTime', 'workContent')):
            post = TimesheetDetails.objects.create(
                user=request.user,
                date=request.POST.get('dateToday'),
                day=request.POST.get('dayToday'),
                startTime=request.POST.get('startTime'),
                endTime=request.POST.get('endTime'),
                breakTime=request.POST.get('breakTime'),
                normalTime=request.POST.get('normalTime'),
                overTime=request.POST.get('extraTime'),
                holidayTime=request.POST.get('holidayTime'),
                weekType=request.POST.get('weekType'),
                attendance=request.POST.get('attendance'),
                content=request.POST.get('workContent')
            )
            return redirect('/list')        
    return render(request,'timesheet/create_timesheet.html')

但是在这里定义一个ModelForm 肯定更好,因为这样可以删除很多样板代码。

此外,您最好在redirect(..) 调用中使用视图的名称,并且不是绝对路径。

【讨论】:

  • 我想使用表单,但我的问题是我的一些字段需要自动生成。我将输入一天的工作开始时间和结束时间,在检查一天、结束时间和开始时间后,我应该会自动生成表格值,例如我的休息时间、我在几个小时内工作了多少,并查看是否有我工作过的任何额外时间。到目前为止没有找到任何带有表单的js源。如果你能帮助我,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多