Django, set initial data to formset with ManyToMany

前端 未结 3 665
-上瘾入骨i
-上瘾入骨i 2021-02-10 21:04

I need to set initial data to formset with ManyToMany field.

Usually i\'m doing like this when there is no ManyToMany field in forms o

相关标签:
3条回答
  • 2021-02-10 21:06

    You should provide a list of pk as initial data for your ManyToMany relation instead of a dict.

    Take a look at this thread, it might helps you.

    0 讨论(0)
  • 2021-02-10 21:10

    Like this:

    class CustomFormSet(BaseInlineFormSet):
        def __init__(self, *args, **kwargs):
            kwargs['initial'] = [
                {'foo_id': 1}
            ]
            super(CustomFormSet, self).__init__(*args, **kwargs)
    

    the foo_id depends on the value that you're selecting for which field on the model relationship

    You have to change also the has_changed method on the form class in order for the it to know that the initial values are "changed" to be taken in account when saved:

    class CustomForm(forms.ModelForm):
        def has_changed(self):
            """
            Overriding this, as the initial data passed to the form does not get noticed,
            and so does not get saved, unless it actually changes
            """
            changed_data = super(starnpc_class, self).has_changed()
            return bool(self.initial or changed_data)
    
    0 讨论(0)
  • 2021-02-10 21:21

    You can use the __init__ function to pre-populate initial data.

    Here's what I used for a similar problem:

    class MyUpdateForm(forms.ModelForm):
    
        def __init__(self, *args, **kwargs):
            super(MyUpdateForm, self).__init__(*args, **kwargs)
            self.initial['real_supplements'] = [s.pk for s in list(self.instance.plan_supplements.all())]
    

    Instead of using self.instance.plan_supplements.all() in my example, you can provide any Queryset.

    0 讨论(0)
提交回复
热议问题