سؤال

لذلك لدي نموذج به ManyToManyField يسمى البطولات.لدي ModelForm مع حقلين للبطولة:

pay_tourns = forms.ModelMultipleChoiceField(
                        queryset=Tourn.objects.all().active().pay_tourns(),
                        widget=forms.CheckboxSelectMultiple())
rep_tourns = forms.ModelMultipleChoiceField(
                        queryset=Tourn.objects.all().active().rep_tourns(),
                        widget=forms.CheckboxSelectMultiple())

الطرق بعد كل () موجودة من فئة فرعية QuerySet.عندما أقوم بحفظ النموذج في وجهة نظري أفعل ذلك:

post.tournaments = (post_form.cleaned_data.get('pay_tourns')
                                + post_form.cleaned_data.get('rep_tourns'))

على أية حال، كل هذا يعمل بشكل جيد.ما لا أستطيع معرفة كيفية فعله هو ملء حقول النموذج هذه عندما أقوم بتحميل منشور موجود.أي عندما أقوم بتمرير مثيل = النشر إلى النموذج.أيه أفكار؟

هل كانت مفيدة؟

المحلول 2

وكان باولو Bergantino على الطريق الصحيح، وساعدني على العثور عليه. كان هذا هو الحل:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)

    instance = kwargs.get('instance')
    if instance:
        self.fields['pay_tourns'].initial = [ o.id for o in instance.tournaments.all().active().pay_tourns()]
        self.fields['rep_tourns'].initial = [ o.id for o in instance.tournaments.all().active().rep_tourns()]

نصائح أخرى

يمكنك أن تفعل شيئًا كهذا في ModelForm:

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)

    instance = kwargs.get('instance')
    if instance:
        self.fields['pay_tourns'].queryset.filter(post=instance)
        self.fields['rep_tourns'].queryset.filter(post=instance)

لا أفهم سبب عدم نجاح ذلك، لكنني سأختبره فقط للتأكد...

يحرر: تم اختباره ويعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top