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

filter manytomanyfield form 'str' object has no attribute 'get'

我的论文 类 models.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)

因为我想要 "Address" 模型中的 "child" 字段只显示与 "parent" 相关的 "child" 对象 我将这段代码写到我的 forms.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)

views.py

def address(request, parent_id):
    parent = get_object_or_404(Parent, id=parent_id)
    if request.method == 'POST':
        form = AddressForm(request.POST, parent_id)
        if form.is_valid():
            address = form.save(commit=False)
            address.parent = parent
            address.save()
            return redirect('app:address_added')
    else:
        form = AddressForm(parent_id)
    template = "add_address.html"
    context = {'form': form}
    return render(request, template, context)

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

问题:提交时出现此错误:

AttributeError at /manage/add_address/ 'str' object has no attribute 'get'

Traceback:

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner 39. response = get_response(request)

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

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

File "/Users/Developer/Desktop/Projects/******/***/views.py" in add_address 167. if form.is_valid():

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/forms.py" in is_valid 169. return self.is_bound and not self.errors

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/forms/forms.py" in errors 161. self.full_clean()

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

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

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

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

Exception Type: AttributeError at /manage/add_address/ Exception Value: 'str' object has no attribute 'get'

请帮忙?

您已将 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)

在其他方面。