0

3 つのモデルが別々に呼び出されています。1 つは最初の列に、2 番目は 2 番目の列に、3 番目は 3 列目にあります。1 つ目はカテゴリで、変更はありません。2 番目は投稿で、カテゴリが選択されている場合は、それらのカテゴリの投稿を表示する必要があり (そうでない場合はすべてを表示)、3 番目は選択された投稿です (何も表示されない場合は何も表示されません)。

私は get_absolute_url 呼び出しでいくらか機能していますが、あまりにも多く (4 つ) の異なるビューを使用していて、面倒です。また、この方法は常に正しく機能するとは限りません。私が持っている投稿を選択すると、たとえば、まだすべての投稿を表示している可能性がある場合、投稿のリストがそのカテゴリに変更されます。

これを正しく機能させるにはどうすればよいですか?ajaxもこれに適していることは知っていますが、最初にajaxなしで動作させてから実装したいのですか、それともajaxでのみ可能ですか?

これが私の関連コードです:

モデル:

class Category(models.Model):
    name = models.CharField(max_length=30, unique=True)

    def get_absolute_url(self):
        return "/category/%i/" % self.id

class Post(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=256)
    author = models.CharField(max_length=256)
    link = models.URLField(max_length=512)
    dt_published = models.DateTimeField()
    content = models.TextField()

    def get_absolute_url(self):
        return "/%i/%i/" % (self.category.id, self.id)

URL:

urlpatterns += patterns('myapp.views',
    url(r'^main/$', 'mainview'),
    url(r'^post/(\d+)/$', 'mainview2'),
    url(r'^category/(\d+)/$', 'mainview3'),
    url(r'^(\d+)/(\d+)/$', 'mainview4'),
)

ビュー:

def mainview(request):
    category_list = Category.objects.all()
    post_list = Post.objects.all()
    entry = None
    return render(request, 'main.html', {'category_list': category_list, 'post_list': post_list, 'entry': entry})

def mainview2(request, postid):
    category_list = Category.objects.all()
    post_list = Post.objects.all()
    entry = Post.objects.filter(id=postid)
    return render(request, 'mainview.html', {'category_list': category_list, 'post_list': post_list, 'entry': entry})

def mainview3(request, catid):
    category_list = Category.objects.all()
    post_list = Post.objects.filter(category=catid)
    entry = None
    return render(request, 'mainview.html', {'category_list': category_list, 'post_list': post_list, 'entry': entry})

def mainview4(request, catid, postid):
    category_list = Category.objects.all()
    cat_selected = Category.objects.filter(id=catid)
    post_list = Post.objects.filter(category=cat_selected)
    entry = Post.objects.filter(id=postid)
    return render(request, 'main view.html', {'category_list': category_list, 'post_list': post_list, 'entry': entry})
4

1 に答える 1

0

これは、1 つのビューだけで解決できます。

さらに、モデルのメソッドで@permalinkデコレータを使用する必要があります。get_absolute_url()そうすれば、URL を変更する必要がある場合でも、リンクが壊れる危険はありません。

models.py :

class Category(models.Model):
    name = models.CharField(max_length=30, unique=True)

    @models.permalink
    def get_absolute_url(self):
        return ('browser', (), {'category_id': self.id})

class Post(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=256)
    author = models.CharField(max_length=256)
    link = models.URLField(max_length=512)
    dt_published = models.DateTimeField()
    content = models.TextField()

    @models.permalink
    def get_absolute_url(self):
        return ('browser', (), {'category_id': self.category.id, 'post_id': self.id})

urls.py :

urlpatterns = patterns('whatever.views',
    url(r'^browser/$', 'theview', name="browser"),
    url(r'^browser/(?P<category_id>[0-9]+)/$', 'theview', name="browser"),
    url(r'^browser/(?P<category_id>[0-9]+)/(?P<post_id>[0-9]+)/$', 'theview', name="browser"),
)

views.py :

from django.shortcuts import get_object_or_404, render

def theview(request, category_id=None, post_id=None):
    categories = Category.objects.all()
    posts = None
    selected_cat = None
    selected_post = None
    if category_id:
        selected_cat = get_object_or_404(Category, pk=category_id)
        posts = selected_cat.post_set.all()
        if post_id:
            selected_post = posts.filter(pk=post_id)

    return render(
        request,
        'template.html',
        {
            'categories': categories,
            'selected_cat': selected_cat,
            'posts': posts,
            'selected_post': selected_post
        }
    )
于 2013-05-04T00:29:41.317 に答える