Я пытаюсь понять, как увеличивать и уменьшать значения с помощью 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
Если я не ошибаюсь в том, что я видел, здесь есть три вещи, с которыми я вижу проблему...
Вы пытаетесь получить
habit object
. У васHabit.objects.get(Habit,id=habit_id)
, когда должно бытьHabit.objects.get(id=habit_id)
.Вы пытаетесь увеличить и уменьшить несуществующее поле. У вас есть
habit_to_increment.values += 1
, когда в модели нет поля с названиемvalues
. То, что должно там быть, этоIndValue
согласно тому, что вы указали для вашегоHabit model
.После увеличения или уменьшения
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/')