Помогите сократить код функции. 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 шт):

Автор решения: Za Ars
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()

→ Ссылка