Django 如何使用form.instance保存多对多数据?

Django 如何使用form.instance保存多对多数据?,django,django-forms,django-views,Django,Django Forms,Django Views,我正在Django上编写一个应用程序 如何使用form.instance从form保存数据(provider.category) 型号 class RequestProvider(models.Model): category = models.ManyToManyField(Category, related_name="provider_request") class ProviderForm(forms.ModelForm): class Meta: mo

我正在
Django
上编写一个应用程序

如何使用
form.instance
form
保存数据(
provider.category

型号

class RequestProvider(models.Model):
    category = models.ManyToManyField(Category, related_name="provider_request")
class ProviderForm(forms.ModelForm):
    class Meta:
        model = RequestProvider
        fields = ('category',)
        widgets = {
            'category': forms.SelectMultiple(
                attrs={
                    'class': 'select2',
                    'style': 'width: 246px;'
                }
            ),
        }
@method_decorator(currency_account_dec, name='dispatch')
class ProviderCreateView(CreateView):
    form_class = ProviderForm
    template_name = 'provider_create.html'

    def form_valid(self, form):
        provider_id = self.kwargs.get('provider_id',None)
        session_user = self.request.user
        if provider_id:
            form.instance.provider = Provider.objects.get(pk=provider_id)
        form.instance.user = self.request.user
        #form.instance.category = form.cleaned_data.get('category')
        return super(ProviderCreateView,self).form_valid(form)

    def get_context_data(self, **kwargs):
        provider_id = self.kwargs.get('provider_id',None)
        ss = RequestProvider.objects.filter(user=self.request.user)
        for s in ss:
            print(s.category)
        ctx = super(ProviderCreateView, self).get_context_data(**kwargs)
        ctx['organizations'] = Organization.objects.filter(user=self.request.user)
        ctx['payments'] = Payment.objects.all()
        if provider_id:
            this_provider = Provider.objects.get(pk=provider_id)
            ctx['this_provider'] = this_provider
            ctx['categories'] = Category.objects.all()
            ctx['roles'] = this_provider.role.all()
            ctx['payments'] = Payment.objects.all()
            ctx['deliveries'] = Delivery.objects.all()
        return ctx
表格

class RequestProvider(models.Model):
    category = models.ManyToManyField(Category, related_name="provider_request")
class ProviderForm(forms.ModelForm):
    class Meta:
        model = RequestProvider
        fields = ('category',)
        widgets = {
            'category': forms.SelectMultiple(
                attrs={
                    'class': 'select2',
                    'style': 'width: 246px;'
                }
            ),
        }
@method_decorator(currency_account_dec, name='dispatch')
class ProviderCreateView(CreateView):
    form_class = ProviderForm
    template_name = 'provider_create.html'

    def form_valid(self, form):
        provider_id = self.kwargs.get('provider_id',None)
        session_user = self.request.user
        if provider_id:
            form.instance.provider = Provider.objects.get(pk=provider_id)
        form.instance.user = self.request.user
        #form.instance.category = form.cleaned_data.get('category')
        return super(ProviderCreateView,self).form_valid(form)

    def get_context_data(self, **kwargs):
        provider_id = self.kwargs.get('provider_id',None)
        ss = RequestProvider.objects.filter(user=self.request.user)
        for s in ss:
            print(s.category)
        ctx = super(ProviderCreateView, self).get_context_data(**kwargs)
        ctx['organizations'] = Organization.objects.filter(user=self.request.user)
        ctx['payments'] = Payment.objects.all()
        if provider_id:
            this_provider = Provider.objects.get(pk=provider_id)
            ctx['this_provider'] = this_provider
            ctx['categories'] = Category.objects.all()
            ctx['roles'] = this_provider.role.all()
            ctx['payments'] = Payment.objects.all()
            ctx['deliveries'] = Delivery.objects.all()
        return ctx
视图

class RequestProvider(models.Model):
    category = models.ManyToManyField(Category, related_name="provider_request")
class ProviderForm(forms.ModelForm):
    class Meta:
        model = RequestProvider
        fields = ('category',)
        widgets = {
            'category': forms.SelectMultiple(
                attrs={
                    'class': 'select2',
                    'style': 'width: 246px;'
                }
            ),
        }
@method_decorator(currency_account_dec, name='dispatch')
class ProviderCreateView(CreateView):
    form_class = ProviderForm
    template_name = 'provider_create.html'

    def form_valid(self, form):
        provider_id = self.kwargs.get('provider_id',None)
        session_user = self.request.user
        if provider_id:
            form.instance.provider = Provider.objects.get(pk=provider_id)
        form.instance.user = self.request.user
        #form.instance.category = form.cleaned_data.get('category')
        return super(ProviderCreateView,self).form_valid(form)

    def get_context_data(self, **kwargs):
        provider_id = self.kwargs.get('provider_id',None)
        ss = RequestProvider.objects.filter(user=self.request.user)
        for s in ss:
            print(s.category)
        ctx = super(ProviderCreateView, self).get_context_data(**kwargs)
        ctx['organizations'] = Organization.objects.filter(user=self.request.user)
        ctx['payments'] = Payment.objects.all()
        if provider_id:
            this_provider = Provider.objects.get(pk=provider_id)
            ctx['this_provider'] = this_provider
            ctx['categories'] = Category.objects.all()
            ctx['roles'] = this_provider.role.all()
            ctx['payments'] = Payment.objects.all()
            ctx['deliveries'] = Delivery.objects.all()
        return ctx

我相信您可以执行
form.save()
无需重写
表单

@method_decorator(currency_account_dec, name='dispatch')
class ProviderCreateView(CreateView):
    form_class = ProviderForm
    template_name = 'provider_create.html'

    def post(self, request):
        provider_id = self.kwargs.get('provider_id',None)
        session_user = request.user
        form = ProviderForm(request.POST)
        if form.is_valid():
            rq = form.save(commit=False)
            if provider_id:
                rq.provider = Provider.objects.get(pk=provider_id)
            rq.user = self.request.user
            rq.save()
            rq.category = form.cleaned_data.get('category')
            return HttpResponseRedirect('/providers/')
        else:
            return HttpResponseRedirect('/providers/create/')

你为什么认为你需要做什么?调用超类
form\u valid
中的
form.save()
,将保存所有字段,包括多对多字段。您根本不需要定义自己的
表单。无需重写
form\u valid()
,因为默认的
form\u valid
方法已经调用了
form.save()
。@DanielRoseman您能展示正确的方法吗?我只是在学习。。。我将非常感激。