我有两个模型多对多关系,我试图通过从两个模型中减去两个值来更新一个字段,并将更改保存到数据库中。在
class LeaveBalance(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True,)
Leave_current_balance= models.FloatField(null=True, blank=True, default=None)
Year=models.CharField(max_length=100,default='')
def __unicode__(self):
return self.Year
这是我的表格,请假后会通过电子邮件通知主管。主管可使用表格登录系统批准休假。一旦假期被批准,我想调整假期当前的余额。在
class DirectorForm(forms.ModelForm):
class Meta:
model=NewLeave
fields=('Director_Authorization_Status','Authorized_by_Director','Date_Authorized',)
widgets={
'Date_Authorized':DateInput()
}
这是一个允许主管批准休假的函数,它会抛出错误:u'leave_current_balance'
def unitDirectorForm(request,id):
if request.method=='POST':
getstaffid=NewLeave.objects.get(id=id)
form = DirectorForm(request.POST, instance=getstaffid)
if form.is_valid():
getstaffid = form.save(commit=False)
getstaffid.save()
total_days = getstaffid.Total_working_days
current_balance = getstaffid.user.leave_balance.Leave_current_balance
diff_balance = current_balance - total_days
current_balance = diff_balance
current_balance=form.fields['Leave_current_balance']
current_balance.save()
getstaffid.leave_balance.add(current_balance)
return HttpResponse('You have successfuly Authorise the leave')
else:
#getstaffid=NewLeave.objects.get(id=id)
form=DirectorForm()
#c_balance=Leave_Balance.objects.get()
balance_form = leavebbalanceForm()
return render(request,'managerauthorisedform.html',{'form':form})
你得打电话给
refresh_from_db
算了。像balance.refresh_from_db()
从数据库中获取更新的值。在你也可以用另一种方法来做这个。例如:
而上述情况不会导致组合表达式错误。在
或者简单一点:
^{pr2}$更新-重组模型和视图
因此,如果在适当的模型/窗体/视图结构中使用上述代码,那么它就可以工作了,但是我建议您从模型开始重新构建整个代码。我给你举一个简单的工作例子(我测试了这个并成功了):
我的应用程序名在这个例子中:
Myusers1
,因此,如果需要,您可以将该名称更改为您的应用程序名称。在所以模型:
在上面,您可以看到我创建了一个Director和Staff模型,在这个模型中,您可以在管理后端设置任意数量的职员和控制器。我创建了staff模型,因为可能不是所有的员工都是用户,所以我认为将他们与用户分开放在DB中会更好一些。在
重要信息:首先创建Director和Staff模型,然后立即迁移,因为其他两个表将依赖于它们。然后可以创建其他两个模型。在
我也不认为在LeaveBalance模型中,你应该保留比我放在那里的更多的东西。例如,我认为年份字段是多余的,因为您总是可以根据数据库中想要的日期和日期范围进行筛选。在
然后是视图(我只直接从模型中使用简单视图)。使用这些视图类,您不必创建表单,因为它是从模型自动创建的,您可以使用不同的函数/方法在视图和模型类中处理它们。在
然后进来网址.py我定义了所需的URL:
我还没有计算出所有的url路径。在
而模板就像
newleave_form.html
并且当他们提交一个新的休假表单时,至少应该有3个不同的重定向模板,
authorized, pending, and rejected
模板。我只给出一个简单的授权成功模板:不要忘记迁移,然后在管理员py。然后,您应该在数据库中创建一些人员和几个控制器来尝试上述操作。我希望上面的内容能给你一些方向来完成你的项目。我只想给你们举一个非常简单的例子。(您必须创建所有其他必要的模板和视图)。在
如果你创建了一个新的应用程序来尝试上述的,那么在你的项目主网址.py文件,你应该引用(包括)你的应用程序的网址这样添加一个额外的一行到你的项目'网址.py文件。然后你的所有新的应用程序URL必须在你的应用程序的网址.py文件:
这就是你的主要项目网址.py看起来是这样的:
(您必须将
Myusers1
更改为您的应用程序名,)当然,我们可以用Django的模型管理器做很多其他事情:https://docs.djangoproject.com/en/2.1/topics/db/managers/
相关问题 更多 >
编程相关推荐