0

Sur mon site Web, chaque utilisateur a son propre identifiant et mot de passe, donc si un utilisateur est connecté, il peut ajouter, modifier et mettre à jour son enregistrement uniquement.Django modifier et mettre à jour des données avec MySql

models.py est

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

Un utilisateur doit avoir une âge et il devrait être dans une rangée de données dans la base de données.

  1. S'il n'y a aucune donnée dans la base de données, c'est-à-dire s'il s'agit d'une première fois pour l'utilisateur, il est permis à l'utilisateur d'insérer des données dans la base de données.
  2. Si l'utilisateur rouvre une page, les données insérées doivent être affichées en mode modifiable.

Il est tout comme le scénario « si un nouvel utilisateur crée un compte gmail, il peut créer le compte à la première fois et encore il ne peut modifier et mettre à jour leurs coordonnées » .La même procédure que je veux mettre en œuvre dans mon site Web.

Je l'ai essayé avec le code ci-dessus, je ne suis pas en mesure d'insérer les données dans la base de données. J'ai essayé avec l'insertion directe dans mysql db et vérifié, ainsi les données insérées je peux voir en mode éditable mais si je change cela et sauve, il crée une autre rangée de données dans DB.

Ensuite, si je vais l'insérer pour la première fois, je récupère la trace suivante.

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. 

Répondre

0

Basé sur le code que vous avez montré, votre problème le plus probable est que le Report ne aient pas été enregistrées à la base de données. Vous avez pas dit quoi que ce soit au sujet de la ReportForm que vous utilisez, ou les données qui est utilisé avec, mais très probablement la partie suivante est jamais exécuté:

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

Par conséquent, aucun rapport n'est jamais enregistré. Pour cette raison, lorsque vous atteignez cette ligne:

report = Report.objects.get() 

... vous obtiendrez le retraçage que vous mentionnez. Je recommande de remplacer le .get() par .all() ou .filter(), car ils ne lèveront pas une exception lorsqu'il n'y a aucun résultat correspondant.

Pour mettre à jour les données, vous devez d'abord obtenir l'instance du rapport de la base de données, et de passer que la fonction de forme save:

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

I a appliqué les changements de vue comme u dit, mais il montre une erreur, partiellement je franchis maintenant je suis face à l'erreur suivante (1048, "Colonne 'id_utilisateur' ne peut pas être nul") –

+0

Cela implique que la ligne 'report.user = request.user' n'a pas été exécutée. – jro

+0

bien, une idée de comment résoudre ce problème? –

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

J'ai essayé d'exécuter un .get vide() dans un de mes exemples et il m'a donné une erreur similaire. si vous essayez d'obtenir toutes les entités essayer toutes depuis get ne laissera-t-u retourner un article unique:

report = Report.ojbects.all() 
Questions connexes