Django аутентификация | хранение данных о пользователе для каждого объекта

Я изучаю Django представления на основе классов и не могу найти ошибку. Я пишу todo-приложение, используя классы. После успешной аутентификации я перехожу на страницу создания задачи, где пользователь отображается корректно. Я могу сохранять задачи и вижу список всех задач. Затем я выхожу из приложения и вхожу в систему под именем пользователя ahotner. Однако я по-прежнему вижу те же задачи, которые я создал для первого пользователя. Где я ошибся? Почему задачи не разделены по пользователям?

Спасибо!

models.py:

from django.db import models
from django.contrib.auth.models import User




class Task(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    complete = models.BooleanField(default=False)
    create = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return self.title

    class Meta:
        ordering = ['complete']

urls.py:

from django.urls import path
from .views import TaskDetail, TaskList, TaskCreate, TaskUpdate, DeleteTask, CustomLoginView
from django.contrib.auth.views import LogoutView

urlpatterns = [
    path('login/', CustomLoginView.as_view(), name='login'),
    path('logout/', LogoutView.as_view(next_page='login'), name='logout'),
    path('', TaskList.as_view(), name='tasks'),
    path('task/<int:pk>/', TaskDetail.as_view(), name='task'),
    path('create-task/', TaskCreate.as_view(), name='create_task'),
    path('task-update/<int:pk>/', TaskUpdate.as_view(), name='update_task'),
    path('task-delete/<int:pk>/', DeleteTask.as_view(), name='delete_task'),

views.py:

from django.urls import reverse_lazy
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.contrib.auth.views import LoginView
from .models import Task

from django.contrib.auth.mixins import LoginRequiredMixin


class CustomLoginView(LoginView):
    template_name = 'todo_app/login.html'
    fields = '__all__'
    redirect_authenticated_user = True

    def get_success_url(self):
        return reverse_lazy('tasks')


class TaskList(LoginRequiredMixin, ListView):       # django searching todo_app/task_list.html to connect
    model = Task  # class require model OR queryset
    context_object_name = 'tasks'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        print(context)
        context['tasks'] = context['tasks'].filter(user=self.request.user)
        context['count'] = context['tasks'].filter(complete=False).count()
        print(context)
        return context


class TaskDetail(LoginRequiredMixin, DetailView):
    model = Task
    context_object_name = 'task'  # getting object through 'task'
    template_name = 'todo_app/task.html'  # changing default rout


class TaskCreate(LoginRequiredMixin, CreateView):
    model = Task
    fields = ['user', 'title', 'description']       # return all fields of model
    success_url = reverse_lazy('tasks')             # after successful creating object redirect to name='tasks'

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)


class TaskUpdate(LoginRequiredMixin, UpdateView):
    model = Task
    fields = '__all__'
    success_url = reverse_lazy('tasks')


class DeleteTask(LoginRequiredMixin, DeleteView):
    model = Task
    context_object_name = 'task'
    success_url = reverse_lazy('tasks')

task_form.html:

<h3>Task Form</h3>
<a href="{% url 'tasks' %}">Go Back {{ request.user }}</a>
<form method="POST" action="">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Create Task">
</form>

task_list.html:

{% if request.user.is_authenticated %}
    <p>{{ request.user }}</p>
    <form method="post" action="{% url 'logout' %}">
    {% csrf_token %}
    <button type="submit">logout</button>
    </form>
    {% else %}
    <a href="{% url 'login' %}">Login</a>
{% endif %}

<hr>
<h1>My To Do List</h1>
<a href="{% url 'create_task' %}">Add Task</a>

<table>
    <tr>
        <th>Item</th>
        <th></th>
    </tr>
    {% for task in object_list %}
    <tr>
        <td>{{ task.title }}</td>
        <td><a href="{% url 'task' task.id %}">View</a></td>         <!-- 'task' from urls -->
        <td><a href="{% url 'update_task' task.id %}">Edit</a></td>
        <td><a href="{% url 'delete_task' task.id %}">Delete</a></td>
    </tr>
    {% empty %}
    <h3>No items in list</h3>
    {% endfor %}
</table>

login.html:

<h1>Login</h1>

<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Login">
</form>

Я ожидаю сохранения пользовательских данных для каждого объекта отдельно.

После отправки задания видно, что поле пользователя заполнено пользователем, который отправил форму?

Не знаю, имеет ли это какое-то значение, но если посмотреть на приложение Django, которое у меня есть, то возврат функции form_valid будет немного другим.

return super(ThreadCreate, self).form_valid(form)

В вашем случае это будет:

return super(TaskCreate, self).form_valid(form)
Вернуться на верх