Lalli Garden
Lalli Garden

Reputation: 259

Own data for everyuser in django

So I am building a to do app in Django. I have created databases for the users and todo items. But I have a problem, how can each user have its own data. Like every user should add their own data. It seems like there is no answer out there. My models.py

class Task(models.Model):
    title = models.CharField(max_length=200)
    complete = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

My forms.py

class CreateUserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username','email','password1','password2']

So how can I connect those both. I have red that I have to use foreign key. But I really don't understand how I can do it

Upvotes: 1

Views: 112

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476584

You specify a ForeignKey [Django-doc] in the Task model that refers to the user that constructed it:

# app/models.py

from django.db import models
from django.conf import settings

class Task(models.Model):
    title = models.CharField(max_length=200)
    complete = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )

    def __str__(self):
        return self.title

You can then make a ModelForm where you exclude the user. For example:

# app/forms.py

from django import forms
from app.models import Task

class TaskForm(forms.ModelForm):

    class Meta:
        model = Task
        exclude = ['user']

Then in the view we can "inject" the user in the instance we create, for example:

# app/views.py

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from app.forms import TaskForm

@login_required
def create_task(request):
    if request.method == 'POST':
        form = TaskForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            return redirect('name-of-some-view')
    else:
        form = TaskForm()
    return render(request, 'some_template.html', {'form': form})

Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

Upvotes: 1

Related Questions