2017-10-18 9 views
0

Il n'y a pas d'erreur, mais la forme ne sauvegarde pas la base de données. Sinon, il est possible d'ajouter des données depuis l'administrateur django.Impossible d'enregistrer la base de données de Django ModelForm

Les urls et bien travailler redirections, je peux aussi être en mesure d'ouvrir la forme, éditer/mettre les données et appuyez sur soumettre, mais la base de données ne reflète pas.

models.py

from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 

class RPAS(models.Model): 
    user = models.OneToOneField(User) 
    manufacturer = models.CharField(max_length = 100, default = '') 
    model_name = models.CharField(max_length = 100, default = '') 
    serial_no = models.CharField(max_length = 50, default='') 
    reg_mark = models.CharField(max_length = 50, default='') 

    def __str__(self): 
     return self.user.rpas.manufacturer 

# RPAS.profile = property(lambda u: RPAS.objects.get_or_create(user=u)[0]) 

def edit_rpas_profile(sender, **kwargs): 
    if kwargs['created']: 
     user_profile = RPAS(user=kwargs['instance']) 

post_save.connect(edit_rpas_profile, sender=User) 

views.py

from .forms import RPASForm 
from django.contrib.auth.models import User 
from django.core.exceptions import PermissionDenied 

def edit_rpas(request): 
     if request.user.is_authenticated(): 
      if request.method == "POST": 
       form = RPASForm(request.POST,instance=request.user) 
       if form.is_valid(): 
        form.save(commit=False) 
        return redirect ('/account/rpas/') 

      else: 
       form = RPASForm(instance=request.user) 
       args = {'form': form} 
       return render(request, "accounts/edit_rpas.html", args) 
     else: 
      raise PermissionDenied 

forms.py

from django import forms 
from django.contrib.auth.models import User 

from django.forms import ModelForm 
from accounts.models import RPAS 

class RPASForm(ModelForm): 
    class Meta: 
     model = RPAS 
     fields = (
     'manufacturer', 
     'model_name', 
     'serial_no' 
     ) 

modèle

<form action="." method="POST" class="padding"> 
      {% csrf_token %} 

      {{ form.as_p }} 

      <input type="submit" value="Submit"> 

</form> 

et enfin c'est mon admin.py

from .models import RPAS 
class RpasAdmin(admin.ModelAdmin): 
    list_display = ('manufacturer','model_name','reg_mark','serial_no') 

    def user_info(self, obj): 
     return obj.description 

admin.site.register(RPAS, RpasAdmin) 
+1

commit = La valeur False ne sauvegarde pas. –

Répondre

2

Vous économisez avec commit=False, de sorte que l'instance est jamais enregistrée dans la base de données. Retirez-le. Vous devez également passer dans le cas RPAS, pas User, puisque la forme est pour le modèle RPAS.

if request.method == "POST": 
    form = RPASForm(request.POST,instance=request.user.rpas) 
    if form.is_valid(): 
     form.save() 
     return redirect ('/account/rpas/') 
else: 
    form = RPASForm(instance=request.user.rpas) 

Vous avez seulement besoin commit=False si vous souhaitez modifier l'objet avant d'enregistrer, par exemple pour définir le champ user. Vous n'avez pas besoin de faire cela dans ce cas, car le champ user est déjà défini.

if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.user = request.user 
    instance.save() 
    return redirect ('/account/rpas/') 
+0

Merci! Ça marche. Mais 'form = RPASForm (instance = request.user.rpas)' ne fonctionne que parce que les modèles userprofile et rpas sont dans la même application. J'ai décidé de déplacer le modèle RPAS vers une autre application. Maintenant, je reçois l'erreur que l'utilisateur n'a pas de attribiute ÉPR lors de l'utilisation « form = RPASForm (instance = request.user.rpas) » –

+0

'request.user.rpas' fonctionne parce que vous avez un à un champ de' 'à RPAS' User', de sorte que vous pouvez également suivre la relation à l'envers. Les deux modèles ne doivent pas être dans la même application. – Alasdair