मुझे लगता है कि तुम यहाँ के लिए होता है एक नया जोड़ने के लिए ModelMultipleChoiceField
करने के लिए अपनेPizzaForm
, और मैन्युअल मॉडल क्षेत्र के साथ उस प्रपत्र क्षेत्र लिंक, Django कि स्वचालित रूप से काम नहीं चलेगा के रूप में आप के लिए।
निम्नलिखित स्निपेट मददगार हो सकते हैं:
class PizzaForm(forms.ModelForm):
class Meta:
model = Pizza
toppings = forms.ModelMultipleChoiceField(queryset=Topping.objects.all())
def __init__(self, *args, **kwargs):
if kwargs.get('instance'):
initial = kwargs.setdefault('initial', {})
initial['toppings'] = [t.pk for t in kwargs['instance'].topping_set.all()]
forms.ModelForm.__init__(self, *args, **kwargs)
def save(self, commit=True):
instance = forms.ModelForm.save(self, False)
old_save_m2m = self.save_m2m
def save_m2m():
old_save_m2m()
instance.topping_set.clear()
instance.topping_set.add(*self.cleaned_data['toppings'])
self.save_m2m = save_m2m
if commit:
instance.save()
self.save_m2m()
return instance
यह PizzaForm
तब हर जगह उपयोग किया जा सकता है, यहां तक कि व्यवस्थापक में भी:
from django.contrib.admin import site, ModelAdmin
from yourapp.models import Pizza
from yourapp.forms import PizzaForm
class PizzaAdmin(ModelAdmin):
form = PizzaForm
site.register(Pizza, PizzaAdmin)
ध्यान दें
save()
विधि भी वर्बोज़ एक सा हो सकता है, लेकिन अगर आप का समर्थन की जरूरत नहीं है इसे आसान बनाने में कर सकते हैं commit=False
स्थिति, यह तो जैसे कि हो जाएगा:
def save(self):
instance = forms.ModelForm.save(self)
instance.topping_set.clear()
instance.topping_set.add(*self.cleaned_data['toppings'])
return instance
Pizza
में कईTopping
एस हो सकते हैं । प्रत्येकTopping
में कईPizza
एस हो सकते हैं । लेकिन अगर मैं एक जोड़ने केTopping
एक करने के लिएPizza
करता है किPizza
उसके बाद पूर्ण रूप से अपने एक हैTopping
विपरीत है, और इसके?