首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -基于类别的正确重定向

Django -基于类别的正确重定向
EN

Stack Overflow用户
提问于 2016-10-04 20:41:10
回答 1查看 148关注 0票数 0

我有两个问题:

编辑:

我做了一些调整,部分解决了这个问题。但现在,当我提交一个新的博客帖子表单时,它会把我带到错误的url,无论我尝试什么url,我都找不到完整的帖子。当我点击完整帖子的链接时,我得到一个类型错误"Object " post“is not iterable”。"progresstracker“类别工作得很好,”blogtopic/..“不会的。

下面是最新的代码:

views.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
{% 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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2016-10-05 01:14:32

看起来你有几件事要做。首先,您说任何类别都会被发送到一个空白的计算机科学页面。这告诉我,您的if语句总是导致false,所以它试图呈现computerscience.html模板。pt_detail视图在上下文中只有一个Post对象(ptpost)。compsci视图使用相同的computerscience.html模板在上下文中使用posts呈现Post对象的QuerySet。你不能两者兼而有之。因为您的模板在上下文中需要posts,并且只找到ptpost,所以它不能呈现任何内容,因此出现了空白页面。

至于使用category来确定要使用的模板,您可以使用一系列elif语句,也可以这样做:

代码语言:javascript
复制
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字典中选择类别,如果当前类别不在字典中,则使用blog/default_detail.html作为默认值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39852622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档