2017-10-18 3 views
0

Es gibt keine Fehler, aber das Formular wird nicht in der Datenbank gespeichert. Ansonsten ist es möglich, Daten von django admin hinzuzufügen.Kann nicht in der Datenbank von Django ModelForm gespeichert werden

Die URLs und Weiterleitungen funktionieren auch gut, ich kann in der Lage sein, das Formular zu öffnen, bearbeiten/put Daten und drücken Sie Senden, aber die Datenbank spiegelt nicht wider.

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

Vorlage

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

      {{ form.as_p }} 

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

</form> 

und schließlich das ist mein 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 = False bedeutet nicht speichern. –

Antwort

2

Sie sparen mit commit=False, so die Instanz nie in der Datenbank gespeichert. Entfernen Sie es. Sie sollten auch die RPAS Instanz übergeben, nicht die User, da das Formular für das RPAS Modell ist.

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) 

Sie brauchen nur commit=False wenn Sie das Objekt vor dem Speichern bearbeiten möchten, zum Beispiel das user Feld zu setzen. In diesem Fall müssen Sie das nicht tun, da das Feld user bereits festgelegt ist.

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

Danke !! Es klappt. Aber 'form = RPASForm (instance = request.user.rpas)' funktioniert nur, weil sich die Profile userprofile und rpas in derselben App befinden. Ich beschloss, das RPAS-Modell in eine andere App zu verschieben. Jetzt bekomme ich den Fehler, dass der Benutzer keine Attribute Rpas bei der Verwendung von 'Form = RPASForm (instance = request.user.rpas)' –

+0

'request.user.rpas' funktioniert, weil Sie ein eins zu eins Feld von' RPAS' zu 'haben Benutzer, so können Sie die Beziehung auch rückwärts verfolgen. Die zwei Modelle müssen nicht in derselben App sein. – Alasdair

Verwandte Themen