Я пытаюсь понять, как увеличивать и уменьшать значения с помощью Django, но получаю эту ошибку cannot unpack non-iterable ModelBase object

Здравствуйте, у меня проблема с увеличением и уменьшением значения в файле views.py в моем приложении, также я получаю ошибку "cannot unpack non-iterable ModelBase object" Все остальное работает, кроме функции увеличения и уменьшения. Как только я нажимаю кнопку инкремента или декремента, она не работает и выдает эту ошибку. Также я выложу файл view.py, html файл и url, чтобы было больше контекста.

файл views.py

from django.shortcuts import get_object_or_404, redirect, render
from django.http import HttpResponse,HttpRequest
from .models import Habit
# Create your views here.

def list_habit_items(request):
    context = {'habit_list':Habit.objects.all()}
    return render(request,'habits/habit_list.html',context)

def insert_habit_item(request:HttpRequest):
    habit=Habit(IndHabit =request.POST['habit'])
    habit.save()
    return redirect('/habits/list/')

def delete_habit_item(request,habit_id):
    habit_to_delete = Habit.objects.get(id=habit_id)
    habit_to_delete.delete()
    return redirect('/habits/list/')
    
def increment_habit_value(request,habit_id):
    habit_to_increment = Habit.objects.get(Habit,id=habit_id)
    habit_to_increment.values += 1
    habit_to_increment.save(['values'])
    return redirect('/habits/list/')

def decrement_habit_value(request,habit_id):
    habit_to_decrement = Habit.objects.get(Habit,id=habit_id)
    habit_to_decrement.values -= 1
    habit_to_decrement.save(['values'])
    return redirect('/habits/list/')

модели

class Habit(models.Model):
#this makes a attribute that describes the individual Habit
#the individual Habit and Value.
    IndHabit=models.TextField()
   
    IndValue=models.IntegerField()

файл urls.py

from django.urls import path
from . import views



urlpatterns=[
    path('list/',views.list_habit_items),
    path('insert_habit/',views.insert_habit_item,name='insert_habit_item'),
    path('delete_habit/<int:habit_id>',views.delete_habit_item,name='delete_habit_item'),
    path('increment_habit/<int:habit_id>',views.increment_habit_value,name='increment_habit_value'),
    path('decrement_habit/<int:habit_id>',views.decrement_habit_value,name='decrement_habit_value'),
    ]

файл html

Если я не ошибаюсь в том, что я видел, здесь есть три вещи, с которыми я вижу проблему...

  1. Вы пытаетесь получить habit object. У вас Habit.objects.get(Habit,id=habit_id), когда должно быть Habit.objects.get(id=habit_id).

  2. Вы пытаетесь увеличить и уменьшить несуществующее поле. У вас есть habit_to_increment.values += 1, когда в модели нет поля с названием values. То, что должно там быть, это IndValue согласно тому, что вы указали для вашего Habit model.

  3. После увеличения или уменьшения IndValue, вы можете просто вызвать save method на объекте, не передавая ему никакого значения. Что у вас есть habit_to_increment.save(['values']), просто используйте habit_to_increment.save().

Еще одна быстрая рекомендация - установить значение по умолчанию для поля IndValue модели Habit. IndValue=models.IntegerField(default=0).

Идеально, это должно сработать для вас...

def increment_habit_value(request, habit_id):
     habit_to_increment = Habit.objects.get(id=habit_id)
     habit_to_increment.IndValue += 1
     habit_to_increment.save()

     return redirect('/habits/list/')


def decrement_habit_value(request, habit_id):
     habit_to_decrement = Habit.objects.get(id=habit_id)
     habit_to_decrement.IndValue -= 1
     habit_to_decrement.save()

     return redirect('/habits/list/')

То, как вы ссылаетесь на поле, которое вы хотите увеличить, не работает (или, по крайней мере, я никогда не видел этого раньше). Я предполагаю, что вы хотите использовать .values()? Использование .values() может быть полезно для преобразования набора записей в дикту, но в данном случае в этом нет необходимости, особенно если вы просто изменяете поле, а затем сохраняете его обратно в базу данных. Попробуйте следующее

from django.shortcuts import get_object_or_404

def increment_habit_value(request,habit_id):
    #You just need the id value in your objects.get(), as the type of model is defined by Habit as in
    #habit_to_increment = Habit.objects.get(id=habit_id)
    #However,I suspect you were wanting to use [get_object_or_404][2], which conveniently handles a bad id, 
    #and does require the Model as an argument, so I used it here
    habit_to_increment = get_object_or_404(Habit, id=habit_id)
    #Because there is only one object, you can refer to the field you want to increment directly.
    habit_to_increment.IndValue += 1
    habit_to_increment.save()
    return redirect('/habits/list/')

#similarly with the decrement view
def decrement_habit_value(request, habit_id):
    habit_to_decrement = get_object_or_404(Habit, id=habit_id)
    habit_to_decrement.IndValue -= 1
    habit_to_decrement.save()

 return redirect('/habits/list/')
Вернуться на верх