【问题标题】:Django edit and update data with MySqlDjango 使用 MySql 编辑和更新数据
【发布时间】:2013-05-04 10:31:25
【问题描述】:

在我的网站中,每个用户都有自己的登录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. 如果用户重新打开页面,插入的数据应以可编辑模式显示。

就像场景“如果一个新用户创建一个gmail帐户,他可以在第一次创建帐户,然后他只能编辑和更新他们的详细信息”。相同的过程我想在我的网站上实现。

我用上面的代码试过了,我无法在数据库中插入数据。我尝试在 mysql db 中直接插入并检查,所以插入的数据我可以在可编辑模式下看到,但如果我更改并保存,它会在 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.

【问题讨论】:

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


    【解决方案1】:

    根据您显示的代码,您最可能的问题是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)
    

    【讨论】:

    • 我按照你的说法应用了视图中的更改,但它显示了一些错误,部分我清除了现在我面临以下错误(1048,“列'user_id'不能为空”)
    • 这意味着report.user = request.user这一行没有被执行。
    • 我建议你先从 shell 试试。手动创建一个新的Report,用数据填充它的字段,然后保存。然后,看看您是否可以通过.get() 函数检索它。如果可行,请将该代码迁移到您的视图函数。
    【解决方案2】:
    report = Report.objects.get()
    reportform = ReportForm(instance=report)
    

    我试图在我的一个示例中运行一个空的 .get(),它给了我类似的错误。 如果您试图获取所有实体,请尝试所有实体,因为 get only 会让您返回一个唯一项目:

    report = Report.ojbects.all()
    

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 2013-02-21
      • 2014-01-13
      • 1970-01-01
      • 2015-12-07
      相关资源
      最近更新 更多