diff --git a/expenses_manager/expenses/forms.py b/expenses_manager/expenses/forms.py
new file mode 100644
index 0000000..b180361
--- /dev/null
+++ b/expenses_manager/expenses/forms.py
@@ -0,0 +1,17 @@
+from django import forms
+from .models import Expense
+
+class ExpenseForm(forms.ModelForm):
+ class Meta:
+ model = Expense
+ fields = [
+ 'date',
+ 'amount',
+ 'description',
+ 'category',
+ 'account',
+ 'tags',
+ ]
+ widgets = {
+ 'date': forms.DateInput(attrs={'type': 'date'}),
+ }
\ No newline at end of file
diff --git a/expenses_manager/expenses/templates/expenses/expense_confirm_delete.html b/expenses_manager/expenses/templates/expenses/expense_confirm_delete.html
new file mode 100644
index 0000000..926f72e
--- /dev/null
+++ b/expenses_manager/expenses/templates/expenses/expense_confirm_delete.html
@@ -0,0 +1,27 @@
+
+
+
+ Borrar gasto
+
+
+
+ Borrar gasto
+
+
+ ¿Seguro que quieres borrar este gasto?
+
+
+
+ - Fecha: {{ expense.date }}
+ - Importe: {{ expense.amount }}
+ - Categoría: {{ expente.category }}
+
+
+
+
+ Cancelar
+
+
\ No newline at end of file
diff --git a/expenses_manager/expenses/templates/expenses/expense_form.html b/expenses_manager/expenses/templates/expenses/expense_form.html
new file mode 100644
index 0000000..5828676
--- /dev/null
+++ b/expenses_manager/expenses/templates/expenses/expense_form.html
@@ -0,0 +1,36 @@
+
+
+
+
+ {% if form.instance.pk %}
+ Editar gasto
+ {% else %}
+ Nuevo gasto
+ {% endif %}
+
+
+
+
+
+ {% if form.instance.pk %}
+ Editar gasto
+ {% else %}
+ Nuevo gasto
+ {% endif %}
+
+
+
+
+ Volver
+
+
\ No newline at end of file
diff --git a/expenses_manager/expenses/templates/expenses/expense_list.html b/expenses_manager/expenses/templates/expenses/expense_list.html
new file mode 100644
index 0000000..2e9440e
--- /dev/null
+++ b/expenses_manager/expenses/templates/expenses/expense_list.html
@@ -0,0 +1,36 @@
+
+
+
+ Gastos
+
+
+ Mis gastos
+
+ Añadir gasto
+
+
+
+ | Fecha |
+ Importe |
+ Categoría |
+ Cuenta |
+ Acciones |
+
+ {% for expense in expenses %}
+
+ | {{ expense.date }} |
+ {{ expense.amount }} |
+ {{ expense.category }} |
+ {{ expense.account }} |
+ Editar |
+ Borrar |
+
+ {% empty %}
+
+ | No hay gastos todavía |
+
+
+ {% endfor %}
+
+
+
\ No newline at end of file
diff --git a/expenses_manager/expenses/urls.py b/expenses_manager/expenses/urls.py
new file mode 100644
index 0000000..14457e4
--- /dev/null
+++ b/expenses_manager/expenses/urls.py
@@ -0,0 +1,9 @@
+from . import views
+from django.urls import path
+
+urlpatterns = [
+ path('', views.expense_list, name='expense_list'),
+ path('new/', views.expense_create, name='expense_create'),
+ path('/edit/', views.expense_edit, name='expense_edit'),
+ path('/delete/', views.expense_delete, name='expense_delete'),
+]
\ No newline at end of file
diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py
index 91ea44a..bacdb89 100644
--- a/expenses_manager/expenses/views.py
+++ b/expenses_manager/expenses/views.py
@@ -1,3 +1,78 @@
-from django.shortcuts import render
+from django.contrib.auth import login
+from django.utils.ipv6 import is_valid_ipv6_address
+from . models import Expense
+from .forms import ExpenseForm
-# Create your views here.
+from django.shortcuts import get_object_or_404, render, redirect
+from django.contrib.auth.decorators import login_required
+
+@login_required
+def expense_list(request):
+ expenses = Expense.objects.filter(owner=request.user)
+
+ return render (
+ request,
+ 'expenses/expense_list.html',
+ {'expenses': expenses},
+ )
+
+
+@login_required
+def expense_create(request):
+ if request.method == "POST":
+ form = ExpenseForm(request.POST)
+ if form.is_valid():
+ expense = form.save(commit=False)
+ expense.owner = request.user
+ expense.save()
+ form.save_m2m()
+ return redirect('expense_list')
+ else:
+ form = ExpenseForm()
+
+ return render(
+ request,
+ 'expenses/expense_form.html',
+ {'form': form},
+ )
+
+
+@login_required
+def expense_edit(request, pk):
+ expense = get_object_or_404(
+ Expense,
+ pk=pk,
+ owner=request.user,
+ )
+ if request.method == "POST":
+ form = ExpenseForm(request.POST, instance=expense)
+ if form.is_valid():
+ expense = form.save()
+ return redirect('expense_list')
+ else:
+ form = ExpenseForm(instance=expense)
+
+ return render(
+ request,
+ 'expenses/expense_form.html',
+ {'form': form}
+ )
+
+
+@login_required
+def expense_delete(request, pk):
+ expense = get_object_or_404(
+ Expense,
+ pk=pk,
+ owner=request.user,
+ )
+
+ if request.method == 'POST':
+ expense.delete()
+ return redirect('expense_list')
+
+ return render(
+ request,
+ 'expenses/expense_confirm_delete.html',
+ {'expense': expense},
+ )
\ No newline at end of file
diff --git a/expenses_manager/expenses_manager/settings.py b/expenses_manager/expenses_manager/settings.py
index 4983077..774e834 100644
--- a/expenses_manager/expenses_manager/settings.py
+++ b/expenses_manager/expenses_manager/settings.py
@@ -128,3 +128,6 @@ STATIC_URL = 'static/'
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+LOGIN_URL = '/admin/login/'
+LOGIN_REDIRECT_URL = '/'
\ No newline at end of file
diff --git a/expenses_manager/expenses_manager/urls.py b/expenses_manager/expenses_manager/urls.py
index ae9fa2b..d509080 100644
--- a/expenses_manager/expenses_manager/urls.py
+++ b/expenses_manager/expenses_manager/urls.py
@@ -15,8 +15,9 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
-from django.urls import path
+from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
+ path('', include('expenses.urls')),
]