0

在我的網站中,每個用戶都有自己的登錄ID和密碼,所以如果用戶登錄,他只能添加,編輯和更新他的記錄。Django使用MySql編輯和更新數據

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數據庫並進行檢查,所以插入的數據我可以在可編輯模式下看到,但如果我改變它並保存,它會在數據庫中創建另一行數據。

然後,如果我要第一次插入它,我會得到以下回溯。

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. 

回答

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) 
+0

我申請鑑於變化ü說,但它顯示出一些錯誤,部分我現在清除我是面臨以下錯誤(1048,「列'user_id'不能爲空') – 2013-05-04 11:42:29

+0

這意味着'report.user = request.user'行沒有執行。 – jro 2013-05-04 11:50:14

+0

不錯,任何想法如何解決這個問題? – 2013-05-04 12:14:31

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

我試圖運行一個空的獲得()中我的例子之一,它給了我類似的錯誤。 如果你想獲得的所有實體嘗試所有,因爲得到的只是會讓u返回一個獨一無二的項目:

report = Report.ojbects.all()