3

ジェネリックビューdjango-mpttを使用してCRUD機能を実装するにはどうすればよいですか?たくさん検索しましたが、チュートリアル/サンプルコードが1つも見つかりませんでした。

コース階層やカテゴリ階層、または同様のものがあるとしましょう...それらを追加/削除/更新/読み取るにはどうすればよいですか?

たとえば、私はこのモデルを持っています:

from django.db import models
from mptt.models import MPTTModel , TreeForeignKey


class Genre(MPTTModel):
    name            = models.CharField(max_length = 50 , unique = True)
    parent          = TreeForeignKey('self' , null = True , blank = True , related_name = 'children')

    class MPTTMeta:
        order_insertion_by = ['name']

そしてこのviews.py:

from django.views.generic.list_detail import object_list
from mp.models import Genre

def genres_list(request):
    ''' Shows all of the genres '''
    return object_list(request,
            queryset = Genre.tree.all() ,
            template_name = 'genres.html' ,
            # template_object_name = 'nodes' ## Adding "nodes" variable didn't solve the problem
    )

まあ...私はこのエラーを受け取ります(エラーは行番号 "5"にあります:{%recursetreeノード%}):

Caught VariableDoesNotExist while rendering: Failed lookup for key [nodes] in u"[{'paginator': None, 'is_paginated': False, 'page_obj': None, 'nodes_list': [<Genre: Genre object>, <Genre: Genre object>, <Genre: Genre object>, <Genre: Genre object>]}, {'csrf_token': <django.utils.functional.__proxy__ object at 0x7f5bb810f090>}, {'perms': <django.utils.functional.__proxy__ object at 0x7f5bb810ff10>, 'messages': <django.contrib.messages.storage.user_messages.LegacyFallbackStorage object at 0x324af50>, 'user': ....................................

    <html>
2   
3       {% load mptt_tags %}
4       <ul>
5           {% recursetree nodes %}
6           <li>
7               {{node.name}}
4

1 に答える 1

8

MPTTモデルとクラスベースのジェネリックビューを備えたシンプルなCRUDアプリケーション(Django 1.4関数ベースの実装は非推奨になりました)。

さぁ、始めよう

urls.py

from django.conf.urls.defaults import patterns, include, url
from django.views.generic import DetailView, ListView, CreateView, UpdateView
from genre.models import Genre

urlpatterns = patterns('',
    url(r'detail/(?P<pk>\d+)', DetailView.as_view(model=Genre), name="genre_detail",),
    url(r'update/(?P<pk>\d+)', UpdateView.as_view(model=Genre), name="genre_update",),
    url(r'create', CreateView.as_view(model=Genre), name="genre_create",),
    url(r'list', ListView.as_view(model=Genre), name="genre_list",),
)

models.py

from django.core.urlresolvers import reverse
from django.db import models
from mptt.models import MPTTModel


class Genre(MPTTModel):
    name = models.CharField(max_length=50 , unique=True)
    parent = models.ForeignKey('self' , null=True , blank=True , related_name='children')

    def get_absolute_url(self):
        return reverse('genre_detail', kwargs={'pk': self.pk, })

    class MPTTMeta:
        order_insertion_by = ['name']

templates / genre_detail.html

<html>
<body>

<div>Object: {{ object }}</div>
<div>Object's name: {{ object.name }}</div>
<div>Object's parent: {{ object.parent }}</div>

</body>
</html>

テンプレート/genre_form.html

<html>
<body>

<form action="" method="post">
{% csrf_token %}
{{ form.as_ul }}

<button>save</button>
</form>
</body>
</html>

templates / genre_list.html

{% load mptt_tags %}
<html>
<body>
<ul class="root">
    {% recursetree object_list %}
        <li>
            {{ node.name }}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>
</body>
</html>

以上です。

今日は暇があり、このプロジェクトをgithubhttps://github.com/kaygorodov/simple-crud-mpttで共有しまし

独自のクラスベースのビューを定義するにはどうすればよいですか?

genre / views.py

from django.view.generic import UpdateView
class MyCustomUpdateView(UpdateView):
    model = Genre

    def get_form_kwargs(self):
        """
        Returns the keyword arguments for instanciating the form.
        """
        kwargs = super(MyCustomUpdateView, self).get_form_kwargs()
        kwargs.update({'my_first_param_to_init_form': 1,
                      'my_second_param_to_init_form': 2,
        })
        return kwargs

genre / urls.py

url(r'update/(?P<pk>\d+)', MyCustomUpdateView.as_view(), name="genre_update",),
于 2012-07-17T04:56:30.627 に答える