过滤manytomanyfield形式' str'对象没有属性' get'

时间:2016-12-10 04:16:54

标签: python django django-models django-forms manytomanyfield

我的 models.py

中有这些课程
serviceUrl

因为我想要"孩子"字段"地址"模型只显示" child"与" parent"相关的对象我将此代码写入 forms.py

class Parent(models.Model):
    title = models.CharField()

class Child(models.Model): 
    title = models.CharField()
    parent = models.ForeignKey(Parent)

class Address(models.Model)
    title = models.CharField()
    parent = models.ForeignKey(Parent)
    child = models.ManyToManyField(Child)

views.py

class AddressForm(forms.ModelForm):

    class Meta:
        model = Address
        fields = ('title', 'parent', 'child')

    def __init__(self, parent_id, *args, **kwargs):
        super(AddressForm, self).__init__(*args, **kwargs)
        self.fields['child'].queryset = Child.objects.filter(parent__id=parent_id)

结果:子字段仅显示与父请求相关的子对象。这就是我想要的。

问题:当我提交时,我收到此错误:

  

AttributeError at / manage / add_address /' str'对象没有属性   '获得'

     

回溯:

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/core/handlers/exception.py"   在内心     39. response = get_response(request)

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/core/handlers/base.py"   在_get_response中     187. response = self.process_exception_by_middleware(e,request)

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/core/handlers/base.py"   在_get_response中     185. response = wrapped_callback(request,* callback_args,** callback_kwargs)

     

文件" / Users / Developer / Desktop / Projects / ****** / *** / views.py"在   add_address     167.如果是form.is_valid():

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/forms.py"   在is_valid     169.返回self.is_bound而不是self.errors

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/forms.py"   在错误     161. self.full_clean()

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/forms.py"   在full_clean     370. self._clean_fields()

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/forms.py"   在_clean_fields     382. value = field.widget.value_from_datadict(self.data,self.files,   self.add_prefix(名))

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/widgets.py"   在value_from_datadict中     427. upload = super(ClearableFileInput,self).value_from_datadict(data,files,name)

     

文件   " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/widgets.py"   在value_from_datadict中     354. return files.get(name)

     

异常类型:/ manage / add_address / Exception中的AttributeError   价值:' str'对象没有属性' get'

请帮忙吗?

1 个答案:

答案 0 :(得分:1)

您已将parent_id作为表单的第一个位置参数,因此您应该在POST块中传递它:

form = AddressForm(parent_id, request.POST)

请注意,最好不要更改表单的签名,而是使用kwargs:

def __init__(self, *args, **kwargs):
    parent_id = kwargs.pop('parent_id', None)
    super(AddressForm, self).__init__(*args, **kwargs)

并且做:

form = AddressForm(request.POST, parent_id=parent_id)
POST块中的

form = AddressForm(parent_id=parent_id)

在其他地方。