在这里使用Django的新手。我正在尝试创建一个将数据保存到数据库的DJango表单。为此,我使用CreateView
当调用“执行工作”的URL时,我将其设置如下(因此,也传入参数)
url(r'^owner/contacts/add/(?P<tenantid>[0-9]+)/$', views.MstrstoreheadcontactCreateView.as_view(), name='owner-contact-add'),
当尝试将数据保存到数据库时,我收到的错误似乎是由于某些字段未正确设置而导致
我得到的确切错误信息是:
以上异常(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
选项创建的(用于为数据库中已存在的表自动生成类)
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
用“字段”定义的属性是在表单上看到的属性。然而,当进行“保存”时,其他字段看起来好像被忽略了(如错误日志中所示)。
目前,正在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?
我是否需要创建表单以与视图一起使用?
答案 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)