クラスベースのビューでインラインフォームを作成しようとしていますが、hereのインスツルメンテーションに従っています。私が作った唯一の変更は、インスタンスにself.request.user代わりのself.objectを与えることだった:Djangoインラインフォームは照会できません。モデルインスタンスである必要があります
class Client(models.Model):
user = models.OneToOneField(CustomUser)
translate = models.BooleanField(default=False)
class ClientData(models.Model):
client = models.ForeignKey(Client)
language = models.ForeignKey(Language)
forms.py
models.py
class ClientForm(ModelForm):
class Meta:
model = Client
fields = '__all__'
exclude = ['user', ]
class ClientDataForm(ModelForm):
class Meta:
model = ClientData
fields = '__all__'
exclude = ['client', ]
ClientFormSet = inlineformset_factory(Client, ClientData, form=ClientDataForm, extra=1)
views.py
class ClientView(LoginRequiredMixin, UpdateView):
model = Client
fields = '__all__'
success_url = reverse_lazy('core:index')
class ClientDataView(LoginRequiredMixin, UpdateView):
template_name = 'core/client_data.html'
model = ClientData
form_class = ClientDataForm
success_url = reverse_lazy('core:index')
def get_object(self, queryset=None):
profile = get_object_or_404(ClientData, client__user=self.request.user)
return profile
def get_context_data(self, **kwargs):
context = super(ClientDataView, self).get_context_data(**kwargs)
if self.request.POST:
context['client_data'] = ClientFormSet(self.request.POST, instance=self.get_object())
else:
context['client_data'] = ClientFormSet(instance=self.get_object())
return context
def form_valid(self, form):
context = self.get_context_data()
client_data = context['client_data']
with transaction.atomic():
self.object = form.save()
if client_data.is_valid():
client_data.instance = self.object
return super(ClientDataView, self).form_valid(form)
私はページを入力しようとするたび は私が取得:
ValueError: Cannot query "[email protected]": Must be "Client" instance.
[13/Dec/2017 15:48:36] "GET /client-data/ HTTP/1.1" 500 143759
この行のために:
context['client_data'] = ClientFormSet(instance=self.get_object())
'get_context_data'でフォームセットをインスタンス化するのは面倒です。 [django-extra-views](https://github.com/AndrewIngram/django-extra-views)を見てみてください。これは、インラインの書式設定を表示します。 – Alasdair
あなたはそれらを使いましたか?私は一度試してみましたが、うまくいきませんでした –
いいえ、私はそれらを使用していませんでした – Alasdair