问题描述
大家好,我正在尝试使用 django 构建一个任务管理器 Web 应用程序,我需要将任务分配给一个或多个用户我在 models.py
和 views.py
中使用多条关系我' m 自动添加 created_by
用户。
我的问题是,当我这样做时,我看到在分配的用户中没有选择任何用户,但如果我从表单中添加用户创建,它运行良好。
class Task(models.Model):
task_id = models.AutoField(primary_key=True)
shortcode = models.CharField(max_length=15,unique=True,blank=True,null=True)
task_name = models.CharField(max_length=200)
task_progress = models.ForeignKey(TaskProgressstatus,on_delete=models.CASCADE,null=True)
customer_name = models.ForeignKey(Customer,null=True)
task_priority = models.ForeignKey(TaskPriority,on_delete=models.CASCADE)
assigned_to_employee = models.ManyToManyField(User)
paid = models.BooleanField(default=False)
on_account = models.BooleanField(default=False)
currency = models.ForeignKey(Currency,null=True)
net_amount = models.DecimalField(decimal_places=2,max_digits=20,null=True)
vat = models.IntegerField(default=11)
quote_validity = models.CharField(max_length=200,default='1 Month from offer date')
delivered = models.BooleanField(default=False)
delivered_date = models.DateTimeField(null=True,blank=True)
creation_date = models.DateTimeField(auto_Now_add=True)
modified_date = models.DateTimeField(auto_Now=True)
due_date = models.DateTimeField(null=True,blank=True)
created_by = models.ForeignKey(User,related_name='created_by_username',null=True,blank=True)
project = models.ForeignKey(Project,on_delete=models.CASCADE)
file_name = models.FileField(upload_to='projects_files',blank=True)
notes = models.TextField()
def __str__(self):
return str(self.task_name)
@login_required
def addtask(request):
form = taskForm()
if request.method == 'POST':
form = taskForm(request.POST)
if form.is_valid():
newform = form.save(commit=False)
newform.created_by = request.user
newform.save()
return HttpResponseRedirect(request.path_info)
else:
context = {'form':form}
return render(request,'tasks/add_task.html',context)
解决方法
更新
正如 Ahmed I. Elsayed 所指出的,问题的标题存在一些不一致之处,因为 created_by
字段实际上是一个 ForeignKey
,而不是一个 ManyToManyField
。>
话虽如此,您的问题实际上出在外键上。
我的建议是首先要确保您的表单实际上有效。你可以通过在 if form.is_valid()
块内打印一些东西来做到这一点。