Task model with EndUser model

Viewed 94

I'm trying to create a task with the current user(EndUser), its title and date_created, but I can create the task with only fields=['title'] specification. I'd like to have the user field automatically filled with an EndUser(current user) and a creation date.

models.py

class EndUser(models.Model):
    user = models.OneToOneField(User, null=True, blank = True, on_delete=models.CASCADE)
    name = models.CharField(max_length = 200, null=True)
    email = models.CharField(max_length = 200, null=True)
    date_created = models.DateField(auto_now_add = True)
    def __str__(self):
        return self.name

class Tag(models.Model):
    CATEGORY = (('My Day', 'My Day'),   
            ('Important', 'Important'),
            ('Planned', 'Planned'),)
    name = models.CharField(max_length=200, null=True, choices=CATEGORY)
    def __str__(self):
        return self.name

class Task(models.Model):
    user = models.ForeignKey(EndUser, null= True, on_delete = models.SET_NULL)
    title = models.CharField(max_length = 200)
    date_created= DateField(auto_now = True)
    tags = models.ManyToManyField(Tag, blank = True)
    def __str__(self):
        return self.title

views.py

@authenticated_user
def mainPage(request):
    tasks = Task.objects.all()
    form = TaskForm()
    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')

    context = {'tasks': tasks[::-1], 'form':form}
    return render(request, 'tasks/todoList.html', context)

forms.py

class TaskForm(ModelForm):
    title = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Add a task' , 'size': '5'}))
    class Meta:
        model = Task
        fields =  ['title']
        #fields = "__all__"

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

Tried the code below but this gives error ValueError: Cannot assign "<SimpleLazyObject: <User: user1212>>": "Task.user" must be a "EndUser" instance.:

    ...
    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            task =  form.save(commit=False)
            task.user = request.user # gives error
            task.save()
            return redirect('/')
    ...

1 Answers

Your request.user, is likely a user object, not an enduser object. You can obtain the corresponding EndUser object with request.user.enduser, given of course the logged in user has a related EndUser:

@authenticated_user
def mainPage(request):
    tasks = Task.objects.all()
    form = TaskForm()
    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            form.instance.user = request.user.enduser
            form.save()
            return redirect('/')

    context = {'tasks': tasks[::-1], 'form':form}
    return render(request, 'tasks/todoList.html', context)

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Related