2013-05-03 63 views
0

我有三個模型分別被調用 - 一個在我的第一列,第二個在我的第二列,第三個在我的第三列。首先是類別,並保持不變。第二個是帖子,如果選擇一個類別,它需要顯示這些類別的帖子(如果沒有顯示全部),第三個是選定的帖子(如果沒有,則不顯示任何內容)。多個Django模型查詢在一個視圖中獨立更改

我有一些get_absolute_url調用工作,但我使用太多(四)不同的意見,它很混亂。而且,這種方式並不總是正常工作。如果我選擇了我所擁有的帖子,那麼當帖子列表更改爲該類別時,例如,您仍然可以顯示所有帖子。

如何正確使用此功能?我知道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) 

URLS:

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}) 

回答

0

你可以用一個視圖解決這個問題。

此外,您應該在您的模型get_absolute_url()方法中使用@permalink decorator。這樣,如果你應該改變你的網址,那麼你不會冒險損壞鏈接。

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 
     } 
    ) 
+0

這仍然給我一個錯誤: 「 AttributeError at/browser/ 'NoneType'對象沒有屬性'post_set'「任何想法? – user2270029 2013-05-04 08:19:29

+0

所以我通過把「posts = Post.objects.filter(category = selected_cat)」而不是「posts = selected_cat.post_set.all()」來解決它,但我還有一個問題。當沒有選擇任何類別或帖子時,當我希望顯示所有帖子時,它不顯示帖子。我將「posts = None」更改爲「posts = Post.objects.all()」,但它不起作用。有任何想法嗎? – user2270029 2013-05-04 08:27:53

+0

由於get_object_or_404保證要麼返回實例,要麼提高404,所以AttributeError不能真正發生在我寫的代碼中。你是否可能在修改我的示例代碼時引入錯誤? – UloPe 2013-05-04 11:50:05