1

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)

私のURLファイルは次のようになります:

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'
4

2 に答える 2

12

アップデート

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')
于 2013-04-19T18:02:49.653 に答える
1

CreateNoteView.get_context_data 関数の署名を確認してください - /create/ は urls.py の CreateNoteView にマップされます

于 2013-04-19T17:58:41.050 に答える