Как объединить отдельные приложения в одну веб-страницу? - PullRequest
3 голосов
/ 26 января 2020

Насколько я понимаю, 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 %}

Как я могу получить эти отдельные независимые приложения на одной домашней странице?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Вам просто нужно импортировать модели из других приложений, а затем использовать представление на основе классов для объединения информации в контекст. Я бы порекомендовал создать новое приложение под названием «Главное», а затем импортировать в него другие модели.

Например (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', {})
0 голосов
/ 27 января 2020

Вид использования решения, данного 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 принципов, это было бы замечательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...