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>

Проблема в том, что вы пытаетесь установить updatedUser.expiration_date в кортеж (request.POST['expiration_date'], f'%m/%d/%Y') вместо datetime.datetime экземпляра.

Для этого нужно использовать datetime.datetime.strptime(), а формат должен быть "%Y-%m-%d", например, так:

import datetime

expiration_date = datetime.datetime.strptime(request.POST['expiration_date'], '%Y-%m-%d %H:%M:%S')

Кроме того, лучше использовать url tag вместо того, чтобы вручную указывать его в атрибуте action.

Редактирование:

expiration_date - это DateTimeField и вы сохраняете в нем только дату, вам следует использовать ввод type="datetime-local в Html, чтобы можно было сохранить и дату, и время.

Вернуться на верх