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

时间:2019-05-06 16:09:32

标签: django django-forms django-views

我正在Django上编写应用程序。

如何使用provider.category保存来自form的数据(form.instance)。

模型

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

2 个答案:

答案 0 :(得分:4)

我相信您可以做到form.save()

答案 1 :(得分:0)

无需重写form_valid

@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/')