具有EndUser模型的任务模型



我正在尝试创建一个具有当前用户(EndUser(、其标题和创建日期的任务,但我只能使用fields=['title']规范创建该任务。我想让用户字段自动填充EndUser(当前用户(和创建日期。

型号.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']

尝试了以下代码,但出现错误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('/')
...

您的request.user很可能是user对象,而不是enduser对象。您可以使用request.user.enduser获得相应的EndUser对象,当然,如果登录用户具有相关的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)

注意:通常使用settings.AUTH_USER_MODEL[Django-doc]来引用用户模型比直接使用User模型[Django-dc]更好。有关更多信息,请参阅文档中引用User模型的部分。

最新更新