既存のパブリケーションに基づいて新しいパブリケーションを作成することができます。これを行うには、新しいアイテムを基にしたいパブリケーションのIDを含む "basedview"へのリンクをクリックするようにします。 n:n関係には2つの形式があります。Django - フォームと対応するインラインフォームセットを事前に入力して別のオブジェクトに基づいて新しいオブジェクトを作成する
すべてのフィールドがprefieldされたフォームを、それが基づいているパブリケーションのデータでprefieldで開くはずです。ユーザーが必要に応じて変更を加えたら、フィールドセットの新しいパブリケーションと新しいリレーションシップを保存する必要があります。後者は難しい部分です。
私の質問は、データベースからすべての対応するフォームセットを読み込み、それらのpkをすべて削除しても、パブリケーションアイテムとの関係を維持するにはどうすればよいですか?
self.object = None
try:
self.object = KombiPublikation.objects.get(pk=self.kwargs['pk'])
except ObjectDoesNotExist:
raise Http404("Keinen Output unter dieser PubID gefunden.")
form = KombiPublikationForm(instance=self.object)
pubspr_formset = KombiPublikationSpracheFormset(instance=self.object)
pubpers_formset = KombiPublikationPersonFormset(instance=self.object)
しかし、それは、既存のパブリケーションのちょうど編集する終わる:
は、今のところは、GETメソッドでは、このようなものです。の後にpk を削除する必要があります。私はformsetに値を設定したり、formsetを別の方法で設定する方法を見つけました。何か案は?
ありがとうございました!ここでは、完全なコードの抜粋
:あなたが設定したらclass PublikationBasedView(PublikationCreateView):
def get(self, request, *args, **kwargs):
self.object = None
try:
self.object = KombiPublikation.objects.get(pk=self.kwargs['pk'])
except ObjectDoesNotExist:
raise Http404("Keinen Output unter dieser PubID gefunden.")
#todo: delete the pk of all objects in forms in formset, else they stay the same and are also changed!!
#fix: delete pk in objekt in order to save it as a new objekt - else based does not work at all!
#self.object.pk=None
form = KombiPublikationForm(instance=self.object)
pubspr_formset = KombiPublikationSpracheFormset(instance=self.object)
pubpers_formset = KombiPublikationPersonFormset(instance=self.object)
return self.render_to_response(
self.get_context_data(
form=form,
pubspr_formset=pubspr_formset,
pubpers_formset=pubpers_formset,
)
)
#its based on this create view
class PublikationCreateView(LoginRequiredMixin, ShowNumberOfItems, CreateView):
form_class = KombiPublikationForm
template_name = 'output/pub_create.html'
model = KombiPublikation
def get(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
pubspr_formset = KombiPublikationSpracheFormset()
pubpers_formset = KombiPublikationPersonFormset()
return self.render_to_response(
self.get_context_data(
form=form,
pubspr_formset=pubspr_formset,
pubpers_formset=pubpers_formset
)
)
def post(self, request, *args, **kwargs):
self.object = None
form_class = self.get_form_class()
form = self.get_form(form_class)
pubspr_formset = KombiPublikationSpracheFormset(self.request.POST)
pubpers_formset = KombiPublikationPersonFormset(self.request.POST)
if form.is_valid() and pubspr_formset.is_valid() and pubpers_formset.is_valid():
return self.form_valid(form, pubspr_formset, pubpers_formset)
else:
return self.form_invalid(form, pubspr_formset, pubpers_formset)
def get_success_msg(self):
return 'Ihr Output wurde erfolgreich unter PubID {} angelegt. Speicherort: {}. <br>'.format(self.object.pk, self.object.status)
def form_valid(self, form, pubspr_formset, pubpers_formset):
""" Called if all forms are valid."""
self.object = form.save()
pubspr_formset.instance = self.object
pubspr_formset.save()
pubpers_formset.instance = self.object
pubpers_formset.save()
messages.success(self.request, self.get_success_msg())
return redirect(self.get_success_url())
def form_invalid(self, form, pubspr_formset, pubpers_formset):
""" Called if whether a form is invalid. Re-renders data-filled forms and errors."""
return self.render_to_response(
self.get_context_data(
form=form,
pubspr_formset=pubspr_formset,
pubpers_formset=pubpers_formset,
))
こんにちは、そこは正しい方法だと思います。問題は、redered形式で外部キー値を設定しないということです。 値としてdictに入っていても、すべてが外部キーにあります。 なぜフォームに表示されないのでしょうか? – teconomix
Hmmm ...おそらくあなたのFieldsがModelChoiceFieldsなので、model_to_dictから出てくるデータは正しいフォーマットではないでしょう。実験して調整する必要があります。 –
私はfkオブジェクトをロードしようとし、dictの値を対応するオブジェクトに置き換えました。しかしまだ - 外部キーの値は、レンダリングされたフォームに表示されません... ...( – teconomix