Помогите сократить код функции. Django
Не могу додуматься как можно сократить и привести к хорошему виду эту функцию:
@login_required(login_url='login_page')
def todo_create(request):
quantity_todos = Profile.objects.all().values("quantity_todos")
todos = Todo.objects.all()
categories = Category.objects.all()
profile = request.user.profile
form = TodoCreateForm()
if request.method == "POST":
form = TodoCreateForm(request.POST)
if form.is_valid():
if request.user.profile.quantity_todos < 10 or request.user.profile.premium_status == True:
todo = form.save(commit = False)
todo.user=request.user
todo.save()
profile.quantity_todos += 1
profile.save()
return redirect('todo_list')
elif request.user.profile.quantity_todos >= 10 and request.user.profile.premium_status == False:
return redirect("profile_change_status_page")
context = {'form':form, 'todos':todos, 'categories':categories}
return render(request, 'todolist/todo_create.html', context)
Кто знает, как ее можно сократить, сократите пожалуйста или подскажите как правильно.
Ответы (1 шт):
todo.user=request.user
Можно передавать в форму в __init__() и в save формы перед сохранением объекта класть в поле
profile.quantity_todos += 1
profile.save()
Аналогично, но только в save формы
request.user.profile.quantity_todos < 10 or request.user.profile.premium_status == True
Можно вынести в метод модели Profile, например can_add_todo. Будет выглядеть так
def can_add_todo(self):
return self.quantity_todos < 10 or self.premium_status
Все эти изменения не обязательны, стоит подумать о них только если код дублируется в разных местах
Что касается изменений - в дополнение к комментарию @insolor
request.user.profile.quantity_todos < 10 or request.user.profile.premium_status == True
В условии == True лишний, так как если request.user.profile.premium_status равен True то и вернет True и нет смысла сравнивать True с True. Можно заменить на
request.user.profile.quantity_todos < 10 or request.user.profile.premium_status
А еще вы создали переменную profile и не используете.
Можно заменить то же условие на
profile.quantity_todos < 10 or profile.premium_status
при условии, что не вынесли блок
profile.quantity_todos += 1
profile.save()
в save. В противном случае, стоит проверить, что все отрабатывает правильно, если нет - всегда можно сделать profile.refresh_from_db()