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您能展示正确的方法吗?我只是在学习。。。我将非常感激。