Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django内联表单无法查询,必须是模型实例_Python_Django - Fatal编程技术网

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

Python Django内联表单无法查询,必须是模型实例,python,django,Python,Django,我正在尝试使用基于类的视图生成内联表单,我遵循了中的说明。我所做的唯一更改是将self.request.user而不是self.object指定给实例: 型号.py class Client(models.Model): user = models.OneToOneField(CustomUser) translate = models.BooleanField(default=False) class ClientData(models.Model): client

我正在尝试使用基于类的视图生成内联表单,我遵循了中的说明。我所做的唯一更改是将self.request.user而不是self.object指定给实例:

型号.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)
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)
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)
forms.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)
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)
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)
视图.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)
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)
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()) 

您的
get\u对象
正在返回一个
ClientData
实例

def get_object(self, queryset=None):
    profile = get_object_or_404(ClientData, client__user=self.request.user)
    return profile
但是,如错误所示,该实例应该是
客户机
实例,例如:

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

get\u context\u data
中实例化表单集是很有技巧的。您可能想看看,它有一个用于内联表单集的视图。您使用过它们吗?我知道我试过一次,但没有成功。不,我以前没有用过。嗨,现在它正在呈现页面,但是按照他的例子呈现两次相同的表单,有什么想法吗?如何在模板中获取两个表单?我帮不上忙。我会避免尝试将内联表单集添加到
UpdateView
,这是一个相当粗糙的过程。我会尝试django额外视图或使用基于函数的视图。我现在正在使用额外视图,我再次得到相同的表单两次,我不知道为什么,你能帮我一下吗?这是一个与你原来的问题不同的问题,我帮不上忙。