我正在使用django开发一个webapp。 通常,我想跟踪用户投入项目的时间。 因此,当用户开始工作时,我在数据库中注册了一个“更改”对象,包括用户,项目以及他开始工作的时间。 现在,如何将相同的“更改”对象转换为不同的视图以记录结束时间? 在我最好的尝试中,我得到了“IntegrityError NOT NULL约束失败”。 这是代码:
views.py
@login_required def main(request): context = RequestContext(request) user=request.user if request.method=='POST': projectid=request.POST['project'] project = Project.objects.get(pk=int(projectid)) if project: change=Change(user=user, project=project,starttime=datetime.now()) change.save() #return HttpResponse("I \'ve already start counting... You \'ve wasted 5 seconds already. Just joking. I don\'t know how to count...") return render_to_response('ProjectLogging/timer.html', {'change':change}, context_instance=RequestContext(request)) else: HttpResponse("Choose a valid project!") else: HttpResponse("Choose a POST method (???????)") @login_required def timer(request, change): user=request.user # schange=request.change if request.method=='POST': change=Change(endtime=datetime.now()) change.save() return render_to_response('ProjectLogging/main.html',{'user':user, 'project_list':Project.objects.all()}, context_instance=RequestContext(request)) else: return HttpResponse("Something went wrong with timer view.")urls.py
urlpatterns=patterns('ProjectLogging', url(r'^$', 'views.login', name="index"), url(r'^login/$', 'views.login', name="login"), url(r'^logout/$', 'views.logout', name="logout"), url(r'^main/$','views.main', name="main"), url(r'^timer/$', 'views.timer', {'change':'change'}), )和改变模型
class Change(models.Model): user=models.ForeignKey(User) project=models.ForeignKey('Project') starttime=models.DateTimeField(null=True,blank=True) endtime=models.DateTimeField(null=True, blank=True) flagged=models.BooleanField(default=False, db_index=True) def __repr__(self): return ('Change in project %r from %r' % (self.project.title, self.user.username)) def __unicode__(self): return ('%r in project: %r' % (self.user.get_full_name(), self.project.title)) def user_changes(self, user): return self.filter(user==user)抱歉原始代码。 我是Django和Python的新手。
I am developing a webapp using django. Generally, I want to keep track of how much time a user has devoted to a project. So when the user starts working, I am registering a "Change" object in the database with the user, the project, and what time he start working. Now, how can I get the same "Change" object to a different view to log the end time? In my best attempt I got an "IntegrityError NOT NULL constraint failed". Here is the code:
views.py
@login_required def main(request): context = RequestContext(request) user=request.user if request.method=='POST': projectid=request.POST['project'] project = Project.objects.get(pk=int(projectid)) if project: change=Change(user=user, project=project,starttime=datetime.now()) change.save() #return HttpResponse("I \'ve already start counting... You \'ve wasted 5 seconds already. Just joking. I don\'t know how to count...") return render_to_response('ProjectLogging/timer.html', {'change':change}, context_instance=RequestContext(request)) else: HttpResponse("Choose a valid project!") else: HttpResponse("Choose a POST method (???????)") @login_required def timer(request, change): user=request.user # schange=request.change if request.method=='POST': change=Change(endtime=datetime.now()) change.save() return render_to_response('ProjectLogging/main.html',{'user':user, 'project_list':Project.objects.all()}, context_instance=RequestContext(request)) else: return HttpResponse("Something went wrong with timer view.")urls.py
urlpatterns=patterns('ProjectLogging', url(r'^$', 'views.login', name="index"), url(r'^login/$', 'views.login', name="login"), url(r'^logout/$', 'views.logout', name="logout"), url(r'^main/$','views.main', name="main"), url(r'^timer/$', 'views.timer', {'change':'change'}), )and the Change model
class Change(models.Model): user=models.ForeignKey(User) project=models.ForeignKey('Project') starttime=models.DateTimeField(null=True,blank=True) endtime=models.DateTimeField(null=True, blank=True) flagged=models.BooleanField(default=False, db_index=True) def __repr__(self): return ('Change in project %r from %r' % (self.project.title, self.user.username)) def __unicode__(self): return ('%r in project: %r' % (self.user.get_full_name(), self.project.title)) def user_changes(self, user): return self.filter(user==user)Sorry for the primitive code. I m new to both Django and Python.
最满意答案
错误在这里:
change=Change(endtime=datetime.now()) change.save()您正在尝试创建一个新对象...
相反,您需要获取之前创建的并保存它。
你需要将id传递给帖子,获取对象并再次保存:
change = Change.objects.get(id=change_id) change.endtime=datetime.now() change.save()这就是我要做的:
从这里改变网址
url(r'^timer/$', 'views.timer', {'change':'change'}),对此:
url(r'^timer/$', 'views.timer', name='timer'),将表单中的change_id作为隐藏输入传递。 由于你没有使用django Forms,你必须写这个
<input type="hidden" value="{{ change.id }}" name="change_id" />将计时器功能更改为:
@login_required def timer(request): ... if request.method=='POST': try: change = Change.objects.get(id=request.POST.get('change_id')) change.endtime=datetime.now() change.save() except: ...应该没问题
the error is here:
change=Change(endtime=datetime.now()) change.save()You are trying to create a new object...
Instead you need to get the previous created one and save it.
you need to pass the id to the post , get the object and save it again:
change = Change.objects.get(id=change_id) change.endtime=datetime.now() change.save()This is what I would do:
change the url from this
url(r'^timer/$', 'views.timer', {'change':'change'}),to this:
url(r'^timer/$', 'views.timer', name='timer'),Pass the change_id in the form as a hidden input. Since you're not using django Forms, you'll have to write this
<input type="hidden" value="{{ change.id }}" name="change_id" />Change the timer function to this:
@login_required def timer(request): ... if request.method=='POST': try: change = Change.objects.get(id=request.POST.get('change_id')) change.endtime=datetime.now() change.save() except: ...that should be ok
更多推荐
发布评论