मुझे लगता है कि तुम यहाँ के लिए होता है एक नया जोड़ने के लिए 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विपरीत है, और इसके?