2017-10-22 13 views
1

ここでDjangoを使用するのが初めてです。私はデータベースにデータを保存するDJangoフォームを作成しようとしています。 「仕事をする」ことであるURLを呼び出す場合、次のようにこれを行うために、私はCreateViewDJango CreateViewはDBにデータを保存する前に属性を設定していません

を使用しています、私はそれが設定されている(ので、パラメータが同様に渡されている)

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

問題:

DBにデータを保存しようと、私が原因ではない適切

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' 

それは0(データベースにすでに存在してテーブル用のクラスを自動生成するために使用)inspectdbオプションを使用して作成されました

このCREATEVIEWはviews.py

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'] = 10CreateViewコードで手動で設定されています。これを修正して、URLで渡される値をとるようにするにはどうすればよいですか。挿入時にフィールドがNoneに設定されているように見えるのはなぜですか?

更新

@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

は、以下の変更を加えた今、データが無い問題でDBに保存されます。私は、ドキュメントからの指示に従ったと(それが以前に存在しなかった)

models.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} 

views.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) 

モデルに "はget_absolute_url" を追加しましたurls.py

urlpatterns = [ 
    url(r'^owner/(?P<pk>[0-9]+)/contact/details/$', views.MstrstoreheadcontactDetailsView.as_view(), name='owner-contact-details'), 
    url(r'^owner/(?P<tenantid>[0-9]+)/contacts/add/$', views.MstrstoreheadcontactCreateView.as_view(), 
     name='owner-contact-add'), 
] 
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 
+0

入力いただきありがとうございます。関数を追加した後、別のエラーが発生しました。投稿の「更新」部分を参照してください。 –

+0

フィールドのリストに 'tenantid'と' contactid'フィールドを追加します。 – dirkgroten

関連する問題