2017-10-18 49 views
0

エラーはありませんが、フォームはデータベースに保存されません。そうでなければ、django adminからデータを追加することが可能です。Django ModelFormからデータベースに保存できません

URLやリダイレクトもうまくいきます。フォームを開いたり、データを編集したり、送信したりすることはできますが、データベースは反映されません。

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> 

、そして最後に、これはあなたがcommit=Falseで保存されているので、インスタンスがデータベースに保存されることはありません私の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

コミット=偽の手段は保存されません。 –

答えて

2

です。それを除く。フォームは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) 

あなたがuserフィールドを設定するために、例えば、保存する前にオブジェクトを編集したい場合にのみcommit=Falseを必要としています。 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)'を使用すると、ユーザーにattribiute rpasがないというエラーが表示されます。 –

+0

'request.user.rpas'は' RPAS'から ' User'を使用しているため、関係を後ろ向きにすることもできます。 2つのモデルは同じアプリ内にある必要はありません。 – Alasdair

関連する問題