在将数据保存到数据库

时间:2017-10-22 15:25:22

标签: python django oracle

在这里使用Django的新手。我正在尝试创建一个将数据保存到数据库的DJango表单。为此,我使用CreateView

当调用“执行工作”的URL时,我将其设置如下(因此,也传入参数)

url(r'^owner/contacts/add/(?P<tenantid>[0-9]+)/$', views.MstrstoreheadcontactCreateView.as_view(), name='owner-contact-add'),

问题:

当尝试将数据保存到数据库时,我收到的错误似乎是由于某些字段未正确设置而导致

enter image description here

我得到的确切错误信息是:

  

以上异常(ORA-02291:完整性约束   (ORAAPPS.SYS_C009216)违反 - 未找到父密钥)是直接的   原因

这就是模型的定义方式:

class Mstrstoreheadcontact(models.Model):
    tenantid = models.ForeignKey('Mstrauthowner', models.DO_NOTHING, db_column='tenantid', blank=True, null=True)
    contactid = models.BigIntegerField(primary_key=True)
    genderid = models.BigIntegerField(blank=True, null=True)
    firstname = models.CharField(max_length=20, blank=True, null=True)
    lastname = models.CharField(max_length=20, blank=True, null=True)
    officephoneno = models.CharField(max_length=20, blank=True, null=True)
    cellphoneno = models.CharField(max_length=20, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'MstrStoreHeadContact'

它是使用inspectdb选项创建的(用于为数据库中已存在的表自动生成类)

这是在views.py

中定义CreateView的方式
class MstrstoreheadcontactCreateView( CreateView ):
    model = Mstrstoreheadcontact
    fields = [ 'firstname', 'lastname', 'officephoneno', 'cellphoneno']

    def form_valid(self, form):
        self.kwargs['tenantid'] = 10

        # returning rendered page
        super(MstrstoreheadcontactCreateView, self).form_valid(form)
        return render(self.request, self.template_name,
                      self.get_context_data(form=form))

    def get_context_data(self, **kwargs):
        ctx = super(MstrstoreheadcontactCreateView, self).get_context_data(**kwargs)
        ctx['tenantid'] = self.kwargs['tenantid']
        return ctx

我的理解是

用“字段”定义的属性是在表单上看到的属性。然而,当进行“保存”时,其他字段看起来好像被忽略了(如错误日志中所示)。 enter image description here

目前,正在self.kwargs['tenantid'] = 10代码中手动设置CreateView。我该如何解决这个问题,以便它将采用与URL一起传递的值。为什么在插入时字段被设置为无?

更新

@dirkgroten - 感谢您的回复!我按照指示添加了功能。这是我得到的错误。

TypeError at /masterdata/owner/contacts/add/10/ __init__() got an unexpected keyword argument 'tenantid'
Request Method: GET
Request URL: http://127.0.0.1:8000/masterdata/owner/contacts/add/10/
Django Version: 1.11.1
Exception Type: TypeError
Exception Value: __init__() got an unexpected keyword argument 'tenantid'

我也看到了这一点:Getting __init__() got an unexpected keyword argument 'instance' with CreateView of Django

How to set ForeignKey in CreateView?

我是否需要创建表单以与视图一起使用?

2 个答案:

答案 0 :(得分:0)

form_valid()方法唯一能做的就是保存表单。因此,通过设置self.kwargs['tenanted'],您不会对表单进行任何更改。您应该改写get_form_kwargs()

def get_form_kwargs(self):
    kwargs = super(MyCreateView, self).get_form_kwargs()
    kwargs.update({'tenantid': 10})
    # You also want to add the contactid, since that's the primary key and is 
    # the actual field the database requires.
    kwargs.update({'contactid': ...})
    return kwargs

答案 1 :(得分:0)

进行了以下更改,现在数据保存到数据库中没有任何问题。我按照文档中的说明将“get_absolute_url”添加到模型中(之前不存在)

<强> models.py

[int(v + '0'*n) for n, v in enumerate(list(str(number))[::-1])][::-1]

[100, 20, 3]

<强> views.py

class Mstrstoreheadcontact(models.Model):
  [.. snip ..]
    # as instructed by
    # http://django.readthedocs.io/en/latest/topics/class-based-views/generic-editing.html#model-forms
    def get_absolute_url(self):
        return reverse('masterdata:owner-contact-details', kwargs={'pk': self.contactid}

<强> urls.py

class MstrstoreheadcontactCreateView( CreateView ):
    model = Mstrstoreheadcontact
    fields = [ 'firstname', 'lastname', 'genderid', 'officephoneno', 'cellphoneno']

    def form_valid(self, form):
        contact = form.save(commit=False)
        contact.tenantid = Mstrauthowner.objects.get(tenantid=self.kwargs['tenantid'])
        return super(MstrstoreheadcontactCreateView, self).form_valid(form)