【问题标题】:django class based view get_context_data got an unexpected keyword arguement基于 django 类的视图 get_context_data 得到了一个意外的关键字参数
【发布时间】:2013-04-13 04:42:11
【问题描述】:

我正在尝试从基于 django 类的视图中执行 CRUD 应用程序。 这是我更新/创建笔记的看法。

class CreateNoteView(CreateView):

    model = Note
    template_name = 'edit_note.html'

    def get_success_url(self):
        return reverse('notes-list')

    def get_context_data(self):

        context = super(CreateNoteView, self).get_context_data(**kwargs)
        context['action'] = reverse('notes-create')
        return context


class UpdateNoteView(UpdateView):

    model = Note
    template_name = 'edit_note.html'

    def get_success_url(self):
        return reverse('notes-list')

    def get_context_data(self, **kwargs):

        context = super(UpdateNoteView, self).get_context_data(**kwargs)
        context['action'] = reverse('notes-edit',
                                    kwargs={'pk':self.get_object().id})
        return context

这是我的模型文件:

# Create your models here.
class Note(models.Model):

    title = models.CharField(max_length=200)
    description = models.TextField()
    pub_date = models.DateField(auto_now_add=True)

我的 urls 文件如下所示:

urlpatterns = patterns('',
       url(r'^create/$',CreateNoteView.as_view(), name='notes-create',),
       url(r'^$', ListNoteView.as_view(), name='notes-list',),    
       url(r'^edit/(?P<pk>\d+)/$', UpdateNoteView.as_view(), name='notes-edit',),                       
)

模板如下:

{% if note.id %}
<h1> Edit Note </h1>
{% else %}
<h1>Add Notes</h1>
{% endif %}

<form action="{{ action }}" method="POST">
  {% csrf_token %}
  <ul>
    {{ form.as_p }}
  </ul>
  <input type="submit" value="Save" />
</form>
<a href="{% url "notes-list" %}">back to list</a>

我收到一个错误,

异常类型:TypeError at /create/

异常值:get_context_data() 得到了一个意外的关键字参数“form”

这是回溯:

File "/home/.virtualenvs/djtalk/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/.virtualenvs/djtalk/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)
File "/home/.virtualenvs/djtalk/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  86.         return handler(request, *args, **kwargs)
File "/home/.virtualenvs/djtalk/local/lib/python2.7/site-packages/django/views/generic/edit.py" in get
  195.         return super(BaseCreateView, self).get(request, *args, **kwargs)
File "/home/.virtualenvs/djtalk/local/lib/python2.7/site-packages/django/views/generic/edit.py" in get
  155.         return self.render_to_response(self.get_context_data(form=form))

Exception Type: TypeError at /create/
Exception Value: get_context_data() got an unexpected keyword argument 'form'

【问题讨论】:

  • 你能告诉我们CreateNoteView的代码吗?您可能正在那里重新定义 get_context_data,但没有 **kwargs 参数。

标签: python django django-forms django-class-based-views


【解决方案1】:

更新

def get_context_data(self):

CreateNoteView 到:

def get_context_data(self, **kwargs):

当您覆盖一个方法时(在这种情况下:get_context_data),您应该确保尽可能保持相同的签名:在这种情况下,get_context_data 预计会收到self, **kwargs


关于您的评论:

class NoteMixin(object):

    model = Note
    template_name = 'edit_note.html'

    def get_success_url(self):
        return reverse('notes-list')

     def get_context_data(self, **kwargs):
        context = super(NoteMixin, self).get_context_data(**kwargs)
        context['action'] = self.get_action()
        return context

class UpdateNoteView(NoteMixin, UpdateView):
    def get_action(self):
        return reverse('notes-edit', kwargs={'pk':self.get_object().id})

class CreateNoteView(NoteMixin, CreateView):
    def get_action(self):
        return reverse('notes-create')

【讨论】:

  • 这个问题有点切题,但你能告诉我如何从基类继承CreateNoteViewUpdateNoteView,以防止重复吗?
  • 这样做会给我一个错误 - AttributeError: Generic detail view CreateNoteView must be called with either an object pk or a slug.
  • 我认为问题出现了,因为CreateNoteView 是从CreateView 继承的,而UpdateNoteView 是从UpdateView 继承的,所以NoteMixin 不应该从UpdateView 继承,如果不是的话UpdateView 那么它应该从什么继承呢?
  • @user1629366 是的,对不起,NoteMixin 应该只继承自 object。糟糕,糟糕的复制粘贴!
  • @JosueTtito 感谢您的编辑。确实有错误。不知道为什么它被拒绝了。
【解决方案2】:

检查您的 CreateNoteView.get_context_data 函数签名 - /create/ 映射到您的 urls.py 中的 CreateNoteView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2020-08-18
    • 2019-02-03
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多