Django内联表单无法查询,必须是模型实例

时间:2017-12-13 16:04:57

标签: python django

我正在尝试使用基于类的视图制作内联表单,我遵循here的内容。我所做的唯一改变是将self.request.user而不是self.object提供给实例:

models.py

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

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 "asd@gmail.com": 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()) 

1 个答案:

答案 0 :(得分:1)

您的get_object正在返回ClientData个实例。

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

或者您可以简单地遵循一对一的关系:

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