2017-10-18 48 views
0

沒有錯誤,但表單不保存到數據庫。否則,它可能會從django admin添加數據。無法從Django ModelForm保存到數據庫

網址和重定向也很好,我可以打開表單,編輯/放置數據並點擊提交,但數據庫沒有反映。

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

模板

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

      {{ form.as_p }} 

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

</form> 

,最後,這是我的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表示不會保存。 –

回答

2

您與commit=False保存,所以實例無法保存到數據庫中。去掉它。您還應該傳遞RPAS實例,而不是User,因爲該表單適用於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) 

你只需要commit=False,如果你想在保存之前編輯的對象,例如設置user領域。在這種情況下,您不需要這樣做,因爲user字段已設置。

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

謝謝!有用。但'form = RPASForm(instance = request.user.rpas)'只能用,因爲userprofile和rpas模型在同一個應用程序中。我決定將RPAS模型移動到另一個應用程序。現在我得到的錯誤是,當使用'form = RPASForm(instance = request.user.rpas)' –

+0

'request.user.rpas'時,用戶沒有attribiute rpas錯誤,因爲你有一對一的字段從'RPAS'到'用戶「,所以你也可以關注後面的關係。這兩個模型不必位於同一個應用程序中。 – Alasdair