【问题标题】:How to combine seperate apps into one webpage?如何将单独的应用程序合并到一个网页中?
【发布时间】:2020-01-26 19:33:02
【问题描述】:

据我了解,Django 完全是关于 DRY 和即插即用架构以及可重用应用程序。我正在尝试使用尽可能正确和整洁的编码创建自己的投资组合网站。鉴于此,我试图让我的应用程序保持独立,所以如果我愿意,或者其他任何人,他们可以自己使用它。问题是我已经完全创建了我的应用程序,但我试图将它们映射到一个主页而不是 blahblah.com/Messaging 和 blahblah.com/Projects

我有两个单独的应用程序,一个是消息表单,以便有人可以与我联系,另一个是我可以列出要在网站上显示的项目。这是我当前的代码。

我的目录结构

/PortfolioWebsite
 /Messaging
    /migrations
    /templates
      /Messaging (namespaced as Django recommends)
        Messagingtem.html
    __init__.py
    admin.py
    apps.py
    tests.py
    forms.py
    models.py
    tests.py
    urls.py
    views.py
 /PortfolioWebsite
   __init.py
   asgi.py
   settings.py
   urls.py
   wsgi.py
 /Projects
   /migrations
   /static
     /Projects (namespaced as Django recommends)
       /images
         projectimage1.jpg
         projectimage2.jpg
   /templates
     /Projects (namespaced as Django recommends)
       projectbase_list.html
   __init__.py
   admin.py
   apps.py
   models.py
   tests.py
   urls.py
   views.py
 /templates
   base.html (used for bootstrap)
 db.sqlite3
 manage.py

不知道是否需要,只是想提供一个想法。

我的views.py 消息:

from django.shortcuts import render, redirect
from .forms import MessageForm
from django.views.generic import TemplateView
# Create your views here.
class MessageView(TemplateView):
    template_name = 'Messaging\Messagingtem.html'
    def get(self, request):
        form = MessageForm
        return render(request, self.template_name, {'form': form})
    def post(self, request):
        form = MessageForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('MessageView')
        else:
            print(form.errors)
        args = {'form': form}
        return render(request, self.template_name, args)

消息模板:

{% extends "base.html" %}

{% block page_content %}
<div class= 'Container' id="Messagingtem">
    <div class= 'form-row'>
        <form method="POST">
            {% csrf_token %}
            <label for='message_text'>Feel free to send me a message!</label>
            <div>
                <label for='message_text'>
                    {% if form.errors %}
                        {% for field in form %}
                            {% for error in field.errors %}
                                {{ error|escape }}
                            {% endfor %}
                        {% endfor %}
                    {% endif %}
                 </label>
            </div>
            {{form.name_text}}
            {{form.email_text}}
            {{form.message_text}}
            <button type="submit" class='btn btn-Primary'>Submit</button>
            <button type="button" class="btn btn-Primary">Close</button>
        </form>
    </div>
</div>
{% endblock %}

项目视图:

from .models import ProjectBase
from django.shortcuts import render
from django.views.generic.list import ListView

class ProjectListView(ListView):
    model = ProjectBase
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

项目模板:

{% extends "base.html" %}
{% load static %}
{% block page_content %}
<div class="Container">
    <div class="row">
        {% for project in object_list %}
            <div class="col-md-4">
                <div class="card mb-2">
                    <img class="card-img-top" src="{% static project.image %}">
                    <div class="card-body">
                        <h5 class="card-title">{{ project.title }}</h5>
                        <p class="card-text">{{ project.description }}</p>
                    </div>
                </div>
            </div>
        {% endfor %}
    </div>
</div>
{% endblock %}

如何将这些独立的应用程序放在一个主页上?

【问题讨论】:

    标签: python html django


    【解决方案1】:

    您只需从其他应用程序导入模型,然后使用基于类的视图将信息合并到上下文中。我建议创建一个名为“Main”的新应用,然后将其他模型导入其中。

    例如(Main/Views.py):

    from django.views.generic import View
    from Messaging.models import Model1, Model2
    from Projects.models import ModelA, ModelB
    
    class IndexView(View):
        def get(self, request, *args, **kwargs):
            # Generate forms & filter models here, then add to `{}` below
            render(request, 'index.html', {})
    

    【讨论】:

    • 对不起,我有点困惑。所以这个解决方案需要重新编写视图并将其作为上下文传递?还有模板呢?对不起,我不明白
    • @ChrisFire 您所做的新答案几乎是最好的解决方法 - 否则您可以删除冗余代码并重定向到索引页面(尽管您会丢失错误消息)
    • 谢谢,我晚上可以睡一会儿了。
    【解决方案2】:

    有点使用 Hybrid 提供的解决方案,这就是我要工作的地方。 感觉很草率,我觉得有更好的方法可以做到这一点,但我想它现在可以工作。

    from django.shortcuts import render, redirect
    from django.views.generic import View
    from Messaging.models import Message
    from Messaging.forms import MessageForm
    from Projects.models import ProjectBase
    
    class Indexview(View):
        def get(self, request, *args, **kwargs):
            form = MessageForm
            Projects = ProjectBase.objects.all()
            context = {'form': form, 'Projects' : Projects}
            return render(request, 'Integration/index.html', context)
        def post(self, request, *args, **kwargs):
            form = MessageForm(request.POST)
            Projects = ProjectBase.objects.all()
            if form.is_valid():
                form.save()
                return redirect('Portfolio')
            else:
                print(form.errors)
            context = {'form': form, 'Projects': Projects}
            return render(request, 'Integration/index.html', context)
    

    对于模板“index.html”,除了变量 object_list 转换为视图上下文中定义的 Projects 之外,它只是相同的组合。

    如果有人可以提供更流畅或更优化且不违反 DRY 原则的代码,那就太好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2013-01-04
      • 2022-12-23
      • 2014-06-25
      相关资源
      最近更新 更多