diff --git a/expenses_manager/expenses/forms.py b/expenses_manager/expenses/forms.py index b180361..51df4db 100644 --- a/expenses_manager/expenses/forms.py +++ b/expenses_manager/expenses/forms.py @@ -1,7 +1,17 @@ from django import forms -from .models import Expense +from .models import Expense, Category class ExpenseForm(forms.ModelForm): + + def __init__(self, *args, **kwargs): + # Get user + user = kwargs.pop('user', None) + + super().__init__(*args, **kwargs) + + if user: + self.fields['category'].queryset = Category.objects.filter(owner=user) + class Meta: model = Expense fields = [ diff --git a/expenses_manager/expenses/models.py b/expenses_manager/expenses/models.py index 6e3f82b..2a3abb6 100644 --- a/expenses_manager/expenses/models.py +++ b/expenses_manager/expenses/models.py @@ -4,8 +4,14 @@ from django.db.models.fields import related class Category(models.Model): name = models.CharField(max_length=100) + owner = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name="categories", + ) + parent = models.ForeignKey( - "self", + 'self', on_delete=models.CASCADE, null=True, blank=True, @@ -13,7 +19,7 @@ class Category(models.Model): ) class Meta: - unique_together = ("name", "parent") + unique_together = ("name", "parent", "owner") verbose_name_plural = "categories" def __str__(self): @@ -60,9 +66,7 @@ class Expense(models.Model): category = models.ForeignKey( Category, - on_delete=models.SET_NULL, - null=True, - blank=True, + on_delete=models.PROTECT, related_name="expenses", ) diff --git a/expenses_manager/expenses/views.py b/expenses_manager/expenses/views.py index bacdb89..04e6f7d 100644 --- a/expenses_manager/expenses/views.py +++ b/expenses_manager/expenses/views.py @@ -1,7 +1,7 @@ +from .models import Expense +from .forms import ExpenseForm from django.contrib.auth import login from django.utils.ipv6 import is_valid_ipv6_address -from . models import Expense -from .forms import ExpenseForm from django.shortcuts import get_object_or_404, render, redirect from django.contrib.auth.decorators import login_required @@ -20,7 +20,7 @@ def expense_list(request): @login_required def expense_create(request): if request.method == "POST": - form = ExpenseForm(request.POST) + form = ExpenseForm(request.POST or None, user=request.user) if form.is_valid(): expense = form.save(commit=False) expense.owner = request.user @@ -28,7 +28,7 @@ def expense_create(request): form.save_m2m() return redirect('expense_list') else: - form = ExpenseForm() + form = ExpenseForm(user=request.user) return render( request, @@ -45,12 +45,12 @@ def expense_edit(request, pk): owner=request.user, ) if request.method == "POST": - form = ExpenseForm(request.POST, instance=expense) + form = ExpenseForm(request.POST or None, instance=expense, user=request.user) if form.is_valid(): expense = form.save() return redirect('expense_list') else: - form = ExpenseForm(instance=expense) + form = ExpenseForm(instance=expense, user=request.user) return render( request,