首页 > 解决方案 > 如何将默认用户设置为django中的当前用户对象?

问题描述

我创建了一个名为ToDoList App的迷你项目。我使用基于类的视图来创建、更新和删除功能。导航栏上有 MyTasks 图标。

我想要什么?
我想将默认用户设置为当前登录用户。一个人的任务不应该被任何其他人看到。

我已经尝试了所有解决方案,但似乎没有任何效果。

这是我在 models.py 文件中的代码:

class MyTasks(models.Model):
    user = models.ForeignKey(User, on_delete=CASCADE, related_name="mytasks")
    task_id = models.AutoField(primary_key=True, verbose_name="ID")
    task_title = models.CharField(max_length=100, default="", help_text="The title of the task", verbose_name="Task Title", blank=False)
    task_desc = models.TextField(default="", help_text="The description of task", verbose_name="Task Description", blank=False)
    task_time = models.DateTimeField(default=timezone.now(), verbose_name="Task Date & Time")
    task_completed = models.BooleanField(default=False, verbose_name="Task Completed")

    def save(self, *args, **kwargs):
        self.user = User
        super(MyTasks, self).save(*args, **kwargs)

    def __str__(self):
        return self.task_title

这是我在 views.py 文件中的代码:

def signup(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f"{username.capitalize()}, you have successfully created an account")
            return redirect("home")
    else:
        form = UserCreationForm()
    return render(request, 'signup.html', context={'form':form})

class TaskCreateView(SuccessMessageMixin, CreateView):
    """View to create new task."""
    model = MyTasks
    context_object_name = 'task'
    template_name = 'task_create.html'
    raise_exception = True
    success_message = 'Task successfully created!'
    fields = ['task_title', 'task_desc', 'task_time']
    success_url = reverse_lazy('task_list')

当我使用save 方法完成任务时,它显示此错误:

ValueError:无法分配“<class 'django.contrib.auth.models.User'>”

请帮助我完成这项任务。任何帮助深表感谢。

标签: pythondjango

解决方案


您需要在表单验证时设置用户。不要忘记删除save模型上的功能。那是行不通的。

from django.views.generic.edit import CreateView


class TaskCreateView(SuccessMessageMixin, CreateView):
    """View to create new task."""
    model = MyTasks
    context_object_name = 'task'
    template_name = 'task_create.html'
    raise_exception = True
    success_message = 'Task successfully created!'
    fields = ['task_title', 'task_desc', 'task_time']
    success_url = reverse_lazy('task_list')

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

推荐阅读