To solve James' problem, we need to maximize his profit given the constraints on the field size and budget. Let's denote the area planted with aster flowers as $x$ square feet and the area planted with stonecrops as $y$ square feet.

The objective function to maximize is the total profit, which can be represented as $60x + 80y$, since the profit per square foot of aster flowers is $60 and the profit per square foot of stonecrops is $80.

We have two constraints:
1. The field size constraint: $x + y \leq 120$, because the total area planted cannot exceed 120 square feet.
2. The budget constraint: $20x + 45y \leq 5000$, since the cost of seed for aster is $20 per square foot and for stonecrops is $45 per square foot, and James has a budget of $5000.

Additionally, we have non-negativity constraints:
- $x \geq 0$
- $y \geq 0$

Because we cannot plant a negative area of either type of flower.

Here's how we can represent this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("James_Flower_Profit")

# Define the variables
x = m.addVar(lb=0, name="aster_area")
y = m.addVar(lb=0, name="stonecrop_area")

# Set the objective function to maximize profit
m.setObjective(60*x + 80*y, GRB.MAXIMIZE)

# Add constraints: field size and budget
m.addConstr(x + y <= 120, "field_size")
m.addConstr(20*x + 45*y <= 5000, "budget")

# Optimize the model
m.optimize()

# Check if an optimal solution was found
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: x = {x.x}, y = {y.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```