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)