【问题标题】:Unable to save to database from Django ModelForm无法从 Django ModelForm 保存到数据库
【发布时间】:2017-10-18 11:59:34
【问题描述】:

没有错误,但表单没有保存到数据库。否则,可以从 django admin 添加数据。

网址和重定向也很好用,我可以打开表单、编辑/放置数据并点击提交,但数据库没有反映。

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)

【问题讨论】:

  • commit=False 表示不保存。

标签: python django django-forms django-views


【解决方案1】:

您正在使用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/')

【讨论】:

  • 谢谢!!有用。但 'form = RPASForm(instance=request.user.rpas)' 之所以有效,是因为 userprofile 和 rpas 模型在同一个应用程序中。我决定将 RPAS 模型移至另一个应用程序。现在我在使用'form = RPASForm(instance=request.user.rpas)'时得到用户没有属性rpas的错误
  • request.user.rpas 之所以有效,是因为您有一个从 RPASUser 的一对一字段,因此您也可以向后跟踪关系。这两个模型不必在同一个应用中。
猜你喜欢
  • 2018-07-07
  • 2018-10-10
  • 2013-08-19
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多