【问题标题】:Problems with save ManyToMany field data保存多对多字段数据的问题
【发布时间】:2017-10-12 19:54:25
【问题描述】:

我有 2 个 ManyToManyField 的模态。尝试保存表单时遇到问题。为什么save_m2m() 方法不起作用?

正如您在我的表单中看到的,function 字段我使用ModelChoiceFieldprogram 字段我使用ModelMultipleChoiceField

modals.py:

class Requirement(models.Model):
    group_requirement = models.ForeignKey(GroupRequirement, on_delete=models.CASCADE)

    function = models.ManyToManyField("Function")
    program = models.ManyToManyField('Program')

forms.py:

class RequirementForm(forms.ModelForm):
    function = forms.ModelChoiceField(widget=Select2Widget(), queryset=Function.objects.none())
    program = forms.ModelMultipleChoiceField(widget=Select2MultipleWidget(), queryset=Program.objects.none())

    class Meta:
        model = Requirement
        fields = ('function', 'program')

    def __init__(self, all_functions, all_programs, *args, **kwargs):
        super(RequirementForm, self).__init__(*args, **kwargs)
        self.fields['function'].queryset = all_functions
        self.fields['program'].queryset = all_programs

views.py:

def requirement_add(request, project_id, group_requirement_id):
    group_requirement = get_object_or_404(GroupRequirement, pk=group_requirement_id)

    all_functions = Function.objects.filter(project=project_id)
    all_programs = Program.objects.filter(project=project_id)

    if request.method == 'POST':
        requirement_form = RequirementForm(data=request.POST, all_functions=all_functions, all_programs=all_programs)
        if requirement_form.is_valid():
           requirement = requirement_form.save(commit=False)
           requirement.group_requirement = group_requirement
           requirement.save()
           requirement_form.save_m2m()

错误:

Traceback (most recent call last):
  File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py", line 39, in inner
    response = get_response(request)
  File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Nurzhan\PycharmProjects\RMS\project\views.py", line 1397, in requirement_add
    requirement_form.save_m2m()
  File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\forms\models.py", line 436, in _save_m2m
    f.save_form_data(self.instance, cleaned_data[f.name])
  File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\fields\related.py", line 1573, in save_form_data
    getattr(instance, self.attname).set(data)
  File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\db\models\fields\related_descriptors.py", line 928, in set
    objs = tuple(objs)
TypeError: 'Function' object is not iterable

【问题讨论】:

  • 你在视图中传递给RequirementForm构造函数的all_functions是什么?
  • 我在视图中创建查询集(all_functions),然后将其发送到表单。这个构造函数工作正常。我在函数对象的function 字段列表中显示。我只是没有添加我创建 all_functions 的那部分,因为我认为它并不重要。
  • 我的函数字段是ManyToManyField。但是在表单中,用户只能添加一个对象(在我的原因中是一个函数)。也许是因为这个问题?
  • 我在我的帖子部分添加了我创建 all_functionsall_programs 的位置。可以查一下吗?

标签: python django python-3.x django-1.10


【解决方案1】:

我的问题是我试图通过ModelChoiceField 将一个对象保存到ManyToManyField。 ManyToManyField 期望查询集。我决定从表单字段中获取数据并通过以下代码将它们保存在视图中:

views.py:

function= requirement_form.cleaned_data['function']
programs = requirement_form.cleaned_data['programs']

requirement= requirement_form.save(commit=False)

requirement.function.add(function)
for program in programs:
    requirement.program.add(program) 

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多