2017-12-13 5 views
0

クラスベースのビューでインラインフォームを作成しようとしていますが、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()) 
+0

'get_context_data'でフォームセットをインスタンス化するのは面倒です。 [django-extra-views](https://github.com/AndrewIngram/django-extra-views)を見てみてください。これは、インラインの書式設定を表示します。 – Alasdair

+0

あなたはそれらを使いましたか?私は一度試してみましたが、うまくいきませんでした –

+0

いいえ、私はそれらを使用していませんでした – Alasdair

答えて

1

あなたget_objectClientDataインスタンスを返しています。エラーが示唆するよう

def get_object(self, queryset=None): 
    profile = get_object_or_404(ClientData, client__user=self.request.user) 
    return profile 

しかし、インスタンスは、例えば、Clientインスタンスでなければなりません:

def get_object(self, queryset=None): 
    profile = get_object_or_404(Client, user=self.request.user) 
    return profile 

それとも、単に後方1対1の関係に従うことができます:

def get_object(self, queryset=None): 
    return self.request.user.client 
+0

こんにちは、これはページをレンダリングしていますが、彼の例では同じフォームを2回レンダリングします。テンプレート? –

+0

私はそれを助けることはできません。私はインラインフォームセットを 'UpdateView'に追加しようとするのを避けるでしょう、それはかなりハッキーです。私はdjango-extra-viewsを試したり、関数ベースのビューを使用したりします。 – Alasdair

+0

よく私は今、余分なビューを使用していると再び同じフォームを2回取得している、私はなぜ、あなたはこれで秒を助けることができますか分からないのですか? –

関連する問題