Django:AttributeError:视图对象没有属性'kwargs'

时间:2018-08-20 14:57:56

标签: django formset inline-formset

我正在构建一个视图,该视图是我从URL传入uuid的。但是,当我尝试访问kwarg时,出现了"AttributeError: view object has no attribute 'kwargs'"错误。

在我的模板中,我正在传递一个UUID:

create/97261b96-23b8-4915-8da3-a90b7a0bdc8e/

URL:

re_path(
    r"^create/(?P<uuid>[-\w]+)/$",
    views.DetailCreateView.as_view(),
    name="detail_create"),

视图:

class DetailCreateView(SetHeadlineMixin, LoginRequiredMixin, InlineFormSetView):
    inline_model = Detail
    headline = "Create a Detail"
    form_class = DetailForm
    success_message = "Detail Added"
    template_name = "details/detail_create.html"

    def get_object(self, **kwargs):
        return Post.objects.get_subclass(uuid=self.kwargs.get('uuid'))

    def __init__(self, *args, **kwargs):
        super(DetailCreateView, self).__init__(*args, **kwargs)
        self.object = self.get_object()
        self.model = self.object.__class__()

了解正在发生的事情-

  • Post是一个InheritanceManager模型,其他模型(产品和变体)都继承自该模型。
  • 两个型号的产品和版本都有很多细节。
  • 创建明细后,我会将其添加到Product对象或Variation对象中。
  • 要为InlineFormSetView设置模型,我尝试使用UUID查询对象,并根据要为其创建Detail的对象的类动态设置该对象。

问题

有什么想法为什么我无法访问URL路径中发送的kwarg?

2 个答案:

答案 0 :(得分:4)

kwargs方法之后,在as_view方法中将args__init__属性分配给视图。因此,当您在get_object内部调用__init__时,会引发错误。由于self.kwargs尚未分配。要解决此错误,您可以移动

self.object = self.get_object()
self.model = self.object.__class__()

__init__get_object

class DetailCreateView(SetHeadlineMixin, LoginRequiredMixin, InlineFormSetView):
    inline_model = Detail
    headline = "Create a Detail"
    form_class = DetailForm
    extra = 10
    success_message = "Detail Added"
    template_name = "details/detail_create.html"

    def get_object(self, **kwargs):
        self.object = Post.objects.get_subclass(uuid=self.kwargs.get('uuid'))
        self.model = self.object.__class__()
        return self.object

    def __init__(self, *args, **kwargs):
        super(DetailCreateView, self).__init__(*args, **kwargs)

答案 1 :(得分:0)

尝试使用self.request.query_params.get('uuid')