【问题标题】:Django: "'p' is an invalid keyword argument for this function" in ManyToManyFieldDjango:ManyToManyField 中的“'p' 是此函数的无效关键字参数”
【发布时间】:2015-01-13 01:26:21
【问题描述】:

我尝试从对应于 ManyToManyField 的字段中的记录访问数据时失败。

models.py

class I(models.Model):
   t = models.CharField(max_length=255)
   p = models.ManyToManyField(P)

class P(models.Model):
    name = models.CharField(max_length=255)

forms.py

class MyForm(forms.Form):
   t = forms.CharField(required=True, widget=forms.TextInput())
   p = forms.ModelChoiceField(queryset=P.objects.all().order_by('name'),
                              widget=forms.SelectMultiple())
   # other_fields_requiring_custom_save = ...

def save(self):
    I = I.objects.create(
        t = self.data['t'],
        p = self.data['p'], 
    )
    I.save() # it breaks here: 'P' is an invalid keyword argument for this function" in ManyToManyField

当我尝试设置p = self.data['p'] 时,它在save 上中断。在调试器中我可以看到:

data = <QueryDict: {u'p': [u'2', u'1'], u't': [u'aaa'], ... >

【问题讨论】:

  • ManyToManyField 的参数必须是另一个模型。根据您显示的内容,您的models.py 中的任何位置都没有定义class P(models.Model)
  • 您能否向我们追溯您遇到的异常情况?

标签: python django forms model-view-controller web


【解决方案1】:

您不能通过将create 传递给关键字参数p 来设置多对多关联。您需要单独设置关联,而不是在创建中。您还可以研究如何优化查询,以便创建和设置多对多不会变成太多查询。见this StackOverflow question

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2012-07-07
    • 2013-07-13
    相关资源
    最近更新 更多