2016-10-04 7 views
0

をもとにリダイレクト:ジャンゴ - 正しく、私は二つの問題を抱えているカテゴリ

EDIT:

は、私はいくつかの微調整を行い、部分的に問題を解決しました。しかし、今、私は新しいブログの投稿フォームを提出すると、それは間違ったURLに私を連れて行くと私は何をしようとすると、私は完全な投稿を見つけることができません。私が完全なポストへのリンクをクリックすると、タイプエラー "オブジェクト"ポスト "iterableではありません"が表示されます。カテゴリ "progresstracker"は完全に動作し、 "blogtopics/.."は機能しません。

はここに最新のコードです:

views.py

def pt_detail(request, slug, category): 
    post = get_object_or_404(Post, slug=slug, category__slug=category) 

    template = CATEGORY_TEMPLATES.get(post.category.slug) 
    return render(request, template, {'post': post}) 


def bt_detail(request, slug, category): 
    post = get_object_or_404(Post, slug=slug, category__slug=category) 
    template = CATEGORY_TEMPLATES.get(post.category.slug) 
    return render(request, template, {'post': post}) 

def post_new(request): 
    if request.method == "POST": 
     form = PostForm(request.POST) 
     if form.is_valid(): 
      post = form.save(commit=False) 
      post.author = request.user 
      post.published_date = timezone.now() 
      post.save() 
      if post.category.slug == 'blog-topics': 
       return redirect('bt_detail', slug=post.slug, category=post.category) 
      else: 
       return redirect('pt_detail', slug=post.slug, category=post.category) 
    else: 
     form = PostForm() 
    return render(request, 'blog/post_edit.html', {'form': form}) 

def post_edit(request, slug, category): 
    post = get_object_or_404(Post, slug=slug, category__slug=category) 
    if request.method == "POST": 
     form = PostForm(request.POST, instance=post) 
     if form.is_valid(): 
      post = form.save(commit=False) 
      post.author = request.user 
      post.published_date = timezone.now() 
      post.save() 
      if post.category.slug == 'blog-topics': 
       return redirect('bt_detail', slug=post.slug, category=post.category) 
      else: 
       return redirect('pt_detail', slug=post.slug, category=post.category) 
    else: 
     form = PostForm(instance=post) 
    return render(request, 'blog/post_edit.html', {'form': form}) 

urls.py

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^home/$', views.home, name='home'), 
    url(r'^blogtopics/computer-science/$', views.compsci, name='computer-science'), 
    url(r'^blogtopics/data-science/$', views.datasci, name='data-science'), 
    url(r'^blogtopics/other/$', views.other, name='other'), 
    url(r'^blogtopics/$', views.blogtopics, name='blogtopics'), 
    url(r'^resources/$', views.resources, name='resources'), 
    url(r'^new/$', views.post_new, name='post_new'), 
    url(r'^progresstracker/$', views.progresstracker, name='progresstracker'), 
    url(r'^blogtopics/(?P<category>[\w-]+)/(?P<slug>[\w-]+)/$', views.bt_detail, name='bt_detail'), 
    url(r'^blogtopics/(?P<category>[\w-]+)/(?P<slug>[\w-]+)/edit/$', views.post_edit, name='post_edit'), 
    url(r'^(?P<category>[\w-]+)/(?P<slug>[\w-]+)/$', views.pt_detail, name='pt_detail'), 
    url(r'^(?P<category>[\w-]+)/(?P<slug>[\w-]+)/edit/$', views.post_edit, name='post_edit'), 
] 

computerscience.html

{% extends 'blog/base.html' %} 

{% block nav %} 
    <li><a href="/home">Home</a></li> 
    <li><a href="/progresstracker">Progress Tracker</a></li> 
    <li class="dropdown"> 
     <a class="active" href="/blogtopics" class="dropbtn">Blog Topics</a> 
     <div class="dropdown-content"> 
      <a href="/blogtopics/computer-science">Computer Science</a> 
      <a href="/blogtopics/data-science">Data Science</a> 
      <a href="/blogtopics/other">Other</a> 
     </div> 
    </li> 
    <li><a href="/resources">Resources</a></li> 
{% endblock %} 


{% block content %} 
    <div id="content"> 
       <div class="padding"> 
       <p style="padding-top: 50px"> 
       <div class="post_list"> 
      {% for post in post %} 
       <h3><a href="{{ post.get_absolute_url_bt }}">{{ post.title }}</a></h3> 
       <p>{{ post.published_date }}</p> 
      {% endfor %} 
       </div> 
       </div> 
      </div> 
{% endblock %} 

models.py

class Post(models.Model): 
    title = models.CharField(max_length=100, unique=True) 
    slug = models.SlugField(max_length=100, unique=True) 
    body = models.TextField() 
    posted = models.DateField(db_index=True, auto_now_add=True) 
    category = models.ForeignKey('books.Category', related_name='%(class)s_slug') 
    created_date = models.DateTimeField(
     default = timezone.now) 
    published_date = models.DateTimeField(
     blank=True, null=True) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __unicode__(self): 
     return '%s' % self.title 

    def get_absolute_url(self): 
     return "/%s/%s/" % (self.category, self.slug) 

    def get_absolute_url_bt(self): 
     return "/blogtopics/%s/%s/" % (self.category, self.slug) 

答えて

0

ここではいくつかのことが起こっているようです。最初に、どのカテゴリも空のコンピュータサイエンスページに送られると述べました。これは、ifステートメントが常にfalseになるため、computerscience.htmlテンプレートをレンダリングしようとしていることを示しています。 pt_detailビューには、コンテキスト内に単一のPostオブジェクト(ptpost)があります。 compsciビューは、同じcomputerscience.htmlテンプレートを使用して、コンテキスト内でpostsを使用してPostオブジェクトのQuerySetをレンダリングします。両方を行うことはできません。あなたのテンプレートはあなたの文脈でpostsを予期しており、ptpostしか見つからないので、空白のページは何も描画できません。限り、使用するテンプレートを決定するために、カテゴリを使用して、あなたがelif一連のステートメントを使用することができ、またはあなたがこのような何かを行うことができ

CATEGORY_TEMPLATES = { 
    'progresstracker': 'blog/pt_detail.html', 
    'anothercategory': 'blog/ac_detail.html', 
    'yetanothercategory': 'blog/yac_detail.html', 
} 

def pt_detail(request, slug, category): 
    ptpost = get_object_or_404(Post, slug=slug, category__slug=category) 
    template = CATEGORY_TEMPLATES.get(ptpost.category.slug, 'blog/default_detail.html') 
    return render(request, template, {'ptpost': ptpost}) 

これはCATEGORY_TEMPLATES辞書からカテゴリを選択し、現在のカテゴリがdictにない場合は、blog/default_detail.htmlをデフォルトとして使用してください。

+0

ありがとうございました!私はいくつかの調整(元の編集を参照)を行い、問題の半分を修正しましたが、まだ苦労しています。助けをお待ちしています。 – Andrew

関連する問題