You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django表单更新拍卖到期日时出现fromisoformat类型错误求助

问题

通过表单更新拍卖到期日时触发如下错误,但Django管理面板可正常修改该字段,需实现用户端修改到期日的功能。

错误详情

TypeError at /profile/updateAuction/updateData/1
fromisoformat: argument must be str

相关代码

views.py

@permission_classes([IsOwnerOrReadOnly])
@login_required(login_url='/accounts/login')
def updateData(request, id):
    title = request.POST['title']
    description = request.POST['description']
    expiration_date = (request.POST['expiration_date'], f'%m/%d/%Y')
    lot_cost = request.POST['lot_cost']
    image = request.POST['image']
    updatedUser = Auction.objects.get(id=id)
    updatedUser.description = description
    updatedUser.expiration_date = expiration_date
    updatedUser.lot_cost = lot_cost
    updatedUser.cover = image
    updatedUser.title = title
    updatedUser.save()
    return HttpResponseRedirect(reverse('index'))

models.py

class Auction(models.Model):
    title = models.CharField(max_length=255, null=False, blank=False)
    image = models.ImageField(upload_to='images', default='images/no-image.svg')
    description = models.TextField(null=False, blank=False)
    lot_cost = models.PositiveIntegerField(null=False, blank=False, default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    expiration_date = models.DateTimeField()
    user = models.ForeignKey(User, verbose_name='Пользователь', on_delete=models.CASCADE)

updateAuction.html

<form action="./updateData/{{ Auction.id }}" method="post" class="row w-25">
     {% csrf_token %}
    Title: <input name="title" value="{{ Auction.title }}">
    Description: <input name="description" value="{{ Auction.description }}">
    Image: <input type="file" name="image" value="{{ Auction.cover }}">
    Cost: <input type="number" pattern="[0-9]" min="0" name="lot_cost" onkeypress="return event.charCode >= 48 && event.charCode <= 57" value="{{ Auction.lot_cost }}">
    Expiration date: <input type="date" name="expiration_date" value="{{ Auction.expiration_date }}">
    <input type="submit" value="update" name="submit">
</form>

修复方案

1. 修正到期日类型转换错误

views.py中错误地将expiration_date赋值为元组,而Django的DateTimeField需要接收datetime对象。表单<input type="date">返回YYYY-MM-DD格式字符串,需用datetime.strptime转换并补全时间部分:

from datetime import datetime

# 替换原到期日处理代码
expiration_date_str = request.POST['expiration_date']
# 补全时间为当天23:59:59,可根据需求调整
expiration_date = datetime.strptime(expiration_date_str, '%Y-%m-%d').replace(hour=23, minute=59, second=59)

2. 修复图片上传逻辑

<input type="file">的内容需通过request.FILES获取,且模型字段为image,需修正字段名不匹配问题:

# 替换原图片处理代码
if 'image' in request.FILES:
    auction.image = request.FILES['image']

同时表单需添加enctype="multipart/form-data"属性:

<form action="./updateData/{{ Auction.id }}" method="post" class="row w-25" enctype="multipart/form-data">

3. 优化模板到期日显示

<input type="date">仅需日期部分,需格式化输出模型中的到期日:

Expiration date: <input type="date" name="expiration_date" value="{{ Auction.expiration_date|date:'Y-m-d' }}">

完整修正后的views.py

from datetime import datetime
from django.shortcuts import get_object_or_404

@permission_classes([IsOwnerOrReadOnly])
@login_required(login_url='/accounts/login')
def updateData(request, id):
    auction = get_object_or_404(Auction, id=id)
    
    auction.title = request.POST['title']
    auction.description = request.POST['description']
    
    # 处理到期日
    expiration_date_str = request.POST['expiration_date']
    auction.expiration_date = datetime.strptime(expiration_date_str, '%Y-%m-%d').replace(hour=23, minute=59, second=59)
    
    auction.lot_cost = request.POST['lot_cost']
    
    # 处理图片上传
    if 'image' in request.FILES:
        auction.image = request.FILES['image']
    
    auction.save()
    return HttpResponseRedirect(reverse('index'))

内容的提问来源于stack exchange,提问作者Temka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:55:18