AttributeError:'NoneType'对象没有'all'属性

0 投票
1 回答
3187 浏览
提问于 2025-04-20 12:37

我在填写一个表单时遇到了这个错误。

这是表单的内容:

class locationForm(forms.Form):
    #this form is sent through to give options
    existing_regions= forms.ModelChoiceField(queryset=None, label="Region Name")
    #this form is what is actually is used to determine the associated region (via get_or_create)
    #look at view for details
    region_name = forms.CharField()
    location_name = forms.CharField()
    street_address = forms.CharField()
    city = forms.CharField()
    zip_code = forms.CharField()

我使用了一个视图来处理这个表单,具体是用 get_or_create 方法:

class AddLocation(View):

    template_name = "dash/Addlocation.html"
    form = locationForm()

    def post(self, request, *args, **kwargs):
        form = locationForm(request.POST)
        user = User.objects.get(username=request.user.username)
        form.fields['existing_regions'].queryset = Region.objects.filter(location__manager=user)
        if form.is_valid():
            region_obj, _created = Region.objects.get_or_create(name=form.cleaned_data['region_name'])
            form.cleaned_data['region_name'] = region_obj
            user = User.objects.get(username=request.user.username)
            location = Location(
                region = region_obj,
                name = form.cleaned_data['location_name'],
                street_address = form.cleaned_data['street_address'],
                city = form.cleaned_data['city'],
                zip_code = form.cleaned_data['zip_code']
            )
            location.save()
            own_it = user.get_profile().owned_locations.add(location)

        else:
            form = locationForm(request.POST)
            form.fields['region_name'].queryset = Region.objects.filter(location__manager=user)
            return render(request, self.template_name, {'form': form})

你可以看到,'existing_regions' 表单是提供给前端的,目的是为了让用户选择选项。但最终,前端会确保把选中的名字传递给 'region_name',这个名字会用来创建一个保存为地点(Location)的对象。我不确定这样做是否是最好的方法,但我不知道为什么会出现这个错误。如果需要,我可以提供更多细节。非常感谢任何能帮我解答的人。

这是完整的错误追踪信息:

Internal Server Error: /dash/location/add
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/django/views/generic/base.py", line 87, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/nir/dashboard/pinpoint/apps/locationmanager/views.py", line 64, in post
    return render(request, self.template_name, {'form': form})
  File "/Library/Python/2.7/site-packages/django/shortcuts/__init__.py", line 53, in render
    return HttpResponse(loader.render_to_string(*args, **kwargs),
  File "/Library/Python/2.7/site-packages/django/template/loader.py", line 169, in render_to_string
    return t.render(context_instance)
  File "/Library/Python/2.7/site-packages/django/template/base.py", line 140, in render
    return self._render(context)
  File "/Library/Python/2.7/site-packages/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)
  File "/Library/Python/2.7/site-packages/django/template/base.py", line 840, in render
    bit = self.render_node(node, context)
  File "/Library/Python/2.7/site-packages/django/template/debug.py", line 78, in render_node
    return node.render(context)
  File "/Library/Python/2.7/site-packages/django/template/debug.py", line 91, in render
    output = force_text(output)
  File "/Library/Python/2.7/site-packages/django/utils/encoding.py", line 100, in force_text
    s = s.__unicode__()
  File "/Library/Python/2.7/site-packages/django/forms/forms.py", line 425, in __str__
    return self.as_widget()
  File "/Library/Python/2.7/site-packages/django/forms/forms.py", line 475, in as_widget
    return widget.render(name, self.value(), attrs=attrs)
  File "/Library/Python/2.7/site-packages/django/forms/widgets.py", line 504, in render
    options = self.render_options(choices, [value])
  File "/Library/Python/2.7/site-packages/django/forms/widgets.py", line 528, in render_options
    for option_value, option_label in chain(self.choices, choices):
  File "/Library/Python/2.7/site-packages/django/forms/models.py", line 1044, in __iter__
    for obj in self.queryset.all():
AttributeError: 'NoneType' object has no attribute 'all'

1 个回答

1

你最开始的错误是因为你在声明ModelChoiceField的时候,把查询集设置成了None,而在提交之前又没有给它赋值。你可以试着添加一个get函数,像这样:

def get(self, request, *args, **kwargs):
   form = locationForm()
   # Assing proper ModelChoice queryset.
   form.fields['existing_regions'].queryset = Region.objects.filter(
      location__manager=self.request.user)
   # Here put the rest of your get code...

另外,既然你在使用类视图(CBV),你有没有考虑用FormView来代替普通的视图呢?

撰写回答