【问题标题】:filter manytomanyfield form 'str' object has no attribute 'get'过滤 manytomanyfield 表单“str”对象没有属性“get”
【发布时间】:2017-04-25 14:56:55
【问题描述】:

我的 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)

因为我希望“地址”模型中的“子”字段仅显示与“父”相关的“子”对象,所以我将此代码写入了我的 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)

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

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

/manage/add_address/ 'str' 对象的 AttributeError 没有属性 '得到'

追溯:

文件 “/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”在 添加地址 167. if 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(name))

文件 “/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. 返回文件.get(name)

异常类型:AttributeError at /manage/add_address/ 异常 值:“str”对象没有属性“get”

请帮忙?

【问题讨论】:

  • 你能得到一个堆栈跟踪吗?
  • 我如何获得堆栈跟踪?
  • 我不知道 Django 以及它隐藏在哪里。但肯定会扔掉一个。
  • 发布您的完整回溯。
  • 确定您已发布完整的表格?

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


【解决方案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)

在其他地方。

【讨论】:

  • 我不再收到错误消息。但是,表单中选择的“孩子”没有保存!
  • 已通过将 form.save_m2m() 添加到我的视图中来保存。非常感谢
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多