Django Модель мезонина, создающая два объекта - PullRequest
0 голосов
/ 14 июля 2020

Я использую Mezzanine CMS для Django для создания блога, и мне нужна была отдельная страница для списка моих личных проектов. Я в значительной степени скопировал модель BlogPost с Mezzanine и назвал ее Projects. Все, что мне было нужно, было в модели BlogPost, поэтому я решил не создавать свою собственную. Я предположил, что копирование кода для BlogPost сработает, и это вроде как сработало.

Моя проблема заключается в том, что я go перехожу на страницу администратора, чтобы создать новый проект на панели проектов. Когда я создаю новый проект, он успешно создается. Итак, я вижу это в панели проектов. Когда я go захожу на панель сообщений в блоге, я также вижу только что созданный проект. Каждый раз, когда я делаю сообщение в блоге, оно не отображается на панели проектов. Мне нужно создать проект, чтобы он не отображался на панели сообщений блога. Я напортачил, унаследовав модель BlogPost от модели Projects? Как я могу создать проект без создания сообщения в блоге?

blog posts panel панель проектов

Вот мой app/models.py:

from django.db import models
from mezzanine.blog.models import BlogPost, BlogCategory
# Create your models here.

class Projects(BlogPost):
    github_link = models.CharField(max_length=255, blank=True, null=True)

class ProjectsCategory(BlogCategory):
    pass

Мои представления также идентичны представлениям мезонинов для модели BlogPost.
app/views.py:

from django.shortcuts import render, redirect
from calendar import month_name

from django.contrib.auth import get_user_model
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse
from django.utils.translation import ugettext_lazy as _

#from mezzanine.blog.models import BlogPost, BlogCategory
from theme.models import Projects, ProjectsCategory
from mezzanine.blog.feeds import PostsRSS, PostsAtom
from mezzanine.conf import settings
from mezzanine.generic.models import Keyword
from mezzanine.utils.views import paginate

User = get_user_model()
# Create your views here.

def blog_redirect(request):
    return redirect('/', permanent=True)

def project_list(request, tag=None, year=None, month=None, username=None,
                   category=None, template="projects/projects.html",
                   extra_context=None):
    """
    Display a list of blog posts that are filtered by tag, year, month,
    author or category. Custom templates are checked for using the name
    ``blog/blog_post_list_XXX.html`` where ``XXX`` is either the
    category slug or author's username if given.
    """
    templates = []
    projects = Projects.objects.published(for_user=request.user)
    if tag is not None:
        tag = get_object_or_404(Keyword, slug=tag)
        projects = projects.filter(keywords__keyword=tag)
    if year is not None:
        projects = projects.filter(publish_date__year=year)
        if month is not None:
            projects = projects.filter(publish_date__month=month)
            try:
                month = _(month_name[int(month)])
            except IndexError:
                raise Http404()
    if category is not None:
        category = get_object_or_404(ProjectsCategory, slug=category)
        projects = projects.filter(categories=category)
        templates.append(u"projects/projects_%s.html" %
                          str(category.slug))
    author = None
    if username is not None:
        author = get_object_or_404(User, username=username)
        projects = projects.filter(user=author)
        templates.append(u"projects/projects_%s.html" % username)

    prefetch = ("categories", "keywords__keyword")
    projects = projects.select_related("user").prefetch_related(*prefetch)
    projects = paginate(projects, request.GET.get("page", 1),
                          settings.BLOG_POST_PER_PAGE,
                          settings.MAX_PAGING_LINKS)
    context = {"projects": projects, "year": year, "month": month,
               "tag": tag, "category": category, "author": author}
    context.update(extra_context or {})
    templates.append(template)
    return TemplateResponse(request, templates, context)


def project_detail(request, slug, year=None, month=None, day=None,
                     template="projects/projects_detail.html",
                     extra_context=None):
    """. Custom templates are checked for using the name
    ``blog/blog_post_detail_XXX.html`` where ``XXX`` is the blog
    posts's slug.
    """
    projects = Projects.objects.published(
                                     for_user=request.user).select_related()
    project = get_object_or_404(projects, slug=slug)
    related_posts = project.related_posts.published(for_user=request.user)
    context = {"project": project, "editable_obj": project,
               "related_posts": related_posts}
    context.update(extra_context or {})
    templates = [u"projects/projects_detail_%s.html" % str(slug), template]
    return TemplateResponse(request, templates, context)

Вот мой app/admin.py:

from copy import deepcopy
from django.utils.translation import ugettext_lazy as _
from django.contrib import admin
from mezzanine.blog.admin import BlogPostAdmin
from mezzanine.blog.models import BlogPost
from mezzanine.pages.admin import PageAdmin
from mezzanine.pages.models import RichTextPage
from mezzanine.core.admin import (DisplayableAdmin, OwnableAdmin,
                                  BaseTranslationModelAdmin)
from mezzanine.twitter.admin import TweetableAdminMixin
from mezzanine.conf import settings
from theme.models import Projects

blog_fieldsets = deepcopy(BlogPostAdmin.fieldsets)
blog_fieldsets[0][1]["fields"].insert(-2, "retina")


pages_fieldsets = deepcopy(PageAdmin.fieldsets)
pages_fieldsets[0][1]["fields"].insert(-2, "page_image")
pages_fieldsets[0][1]["fields"].insert(-3, "content")


project_fieldsets = deepcopy(DisplayableAdmin.fieldsets)
project_fieldsets[0][1]["fields"].insert(1, "categories")
project_fieldsets[0][1]["fields"].extend(["content", "allow_comments"])
project_list_display = ["title", "user", "status", "admin_link"]
if settings.BLOG_USE_FEATURED_IMAGE:
    project_fieldsets[0][1]["fields"].insert(-2, "featured_image")
    project_list_display.insert(0, "admin_thumb")
project_fieldsets = list(project_fieldsets)
project_fieldsets.insert(1, (_("Other posts"), {
    "classes": ("collapse-closed",),
    "fields": ("related_posts",)}))
project_list_filter = deepcopy(DisplayableAdmin.list_filter) + ("categories",)



class MyBlogPostAdmin(BlogPostAdmin):
    fieldsets = blog_fieldsets

class MyPageAdmin(PageAdmin):
    fieldsets = pages_fieldsets


class ProjectsAdmin(TweetableAdminMixin, DisplayableAdmin, OwnableAdmin):
    fieldsets = project_fieldsets
    list_display = project_list_display
    list_filter = project_list_filter
    filter_horizontal = ("categories", "related_posts",)

    def save_form(self, request, form, change):
        """
        Super class ordering is important here - user must get saved first.
        """
        OwnableAdmin.save_form(self, request, form, change)
        return DisplayableAdmin.save_form(self, request, form, change)

admin.site.unregister(Projects)
admin.site.unregister(BlogPost)
admin.site.unregister(RichTextPage)
admin.site.register(Projects, ProjectsAdmin)
admin.site.register(BlogPost, MyBlogPostAdmin)
admin.site.register(RichTextPage, MyPageAdmin)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...