【问题标题】:Django SQLite UPDATEDjango SQLite 更新
【发布时间】:2015-03-25 10:41:52
【问题描述】:

我正在使用 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 的新手。

【问题讨论】:

  • 我得到的“完整性错误”是因为服务器等待一个全新的“更改”对象并且没有检索到我想要的对象。
  • 用户一次只能激活一个更改项吗?
  • 我不确定我是否理解你的问题,但可能没有。

标签: python django sqlite


【解决方案1】:

错误在这里:

change=Change(endtime=datetime.now())
change.save()

您正在尝试创建一个新对象...

相反,您需要获取之前创建的并保存它。

您需要将 id 传递给 post ,获取对象并再次保存:

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:
            ...

应该没问题

【讨论】:

  • 我尝试了你的解决方案,但我得到一个'invalid literal for int() with base 10:'''错误。可能是因为“change_id”为空。如何从表单中传递“change_id”(我告诉过你我是新手)。这是我的表格:{%block content%}&lt;h2&gt;You are working at project &lt;h1&gt;{{change.project.title}}&lt;/h1&gt;&lt;br&gt;&lt;/h2&gt;&lt;p&gt;You started at {{change.starttime}}&lt;/p&gt;&lt;form action="/timer/" method="post"&gt;{%csrf_token%} &lt;input type="submit" value="Finished!"&gt;&lt;/form&gt;{%endblock%}
  • 太好了,您正在使用表单。我会编辑我的答案。 2分钟
  • 好的,只需编辑 url,在表单中添加输入,它应该可以正常工作
  • 它现在似乎可以工作,但我在管理页面中遇到另一个错误。 :p 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
相关资源
最近更新 更多