Django使用MySql编辑和更新数据

时间:2013-05-04 10:31:25

标签: django django-models django-forms django-templates django-views

在我的网站中,每个用户都有自己的登录ID和密码,因此如果用户登录,他只能添加,编辑和更新他的记录。

models.py是

class Report(models.Model):
    user = models.ForeignKey(User, null=False)
    name = models.CharField(max_length=20, null=True, blank=True)

views.py

def profile(request):      
    if request.method == 'POST':    
        reportform = ReportForm(request.POST)

        if reportform.is_valid():
            report = reportform.save(commit=False)
            report.user = request.user
            report.save()
            return redirect('/index/')

    else:
        report = Report.objects.get()
        reportform = ReportForm(instance=report)

    return render_to_response('report/index.html',
                   { 'form': reportform, },
                   context_instance=RequestContext(request))

用户应该有一个年龄,并且应该在数据库中的一行数据中。

  1. 如果数据库中没有数据,即如果这是用户的第一次,则允许用户将数据插入数据库。
  2. 如果用户重新打开页面,则插入的数据应以可编辑模式显示。
  3. 就像场景“如果新用户创建了一个gmail帐户,他可以在第一时间创建帐户,并且他只能编辑和更新他们的详细信息”。同样的程序我想在我的网站上实施。

    我用上面的代码尝试过,我无法在数据库中插入数据。我尝试直接插入mysql数据库并检查,因此我可以在可编辑模式下看到插入的数据,但如果我更改并保存,它将在db中创建另一行数据。

    然后,如果我要第一次插入它,我会得到以下追溯。

    Environment:    
    
    Request Method: GET
    Request URL: http://192.168.100.10/report/index/
    
    Django Version: 1.3.7
    Python Version: 2.7.0
    Installed Applications:
    ['django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.admin',
     'django.contrib.admindocs',
     'django.contrib.humanize',
     'django.contrib.staticfiles',
     'south',
     'collect',
     'incident',
     'report_settings']
    Installed Middleware:
    ('django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.transaction.TransactionMiddleware',
     'django.middleware.cache.FetchFromCacheMiddleware')
    
    
    Traceback:
    File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
      111.                         response = callback(request, *callback_args, **callback_kwargs)
    File "/root/Projects/ir/incident/views.py" in when
      559.         report = Report.objects.get()
    File "/usr/lib/python2.7/site-packages/django/db/models/manager.py" in get
      132.         return self.get_query_set().get(*args, **kwargs)
    File "/usr/lib/python2.7/site-packages/django/db/models/query.py" in get
      349.                     % self.model._meta.object_name)
    
    Exception Type: DoesNotExist at report/index/
    Exception Value: Report matching query does not exist.
    

2 个答案:

答案 0 :(得分:0)

根据您显示的代码,您最可能的问题是Report未保存到数据库中。您没有说过您正在使用的ReportForm或与之一起使用的数据,但很可能以下部分永远不会执行:

if reportform.is_valid():
    report = reportform.save(commit=False)
    (...)

因此,没有保存任何报告。因此,当你到达这一行时:

report = Report.objects.get()

...你会得到你提到的追溯。我建议将.get()替换为.all().filter(),因为当没有匹配的结果时,它们不会抛出异常。

要更新数据,您应该先从数据库中获取报表实例,然后将其传递给表单的save函数:

report = Report.objects.filter(name=some_value)
report.user = request.user
reportform.save(instance=report)

答案 1 :(得分:0)

report = Report.objects.get()
reportform = ReportForm(instance=report)

我尝试在我的一个示例中运行一个空的.get(),它给了我类似的错误。 如果你试图让所有实体都尝试所有,那么只有让你返回一个独特的项目:

report = Report.ojbects.all()