Django ManyToMany отношения детали деталей - PullRequest
0 голосов
/ 23 октября 2018

Я хорошо прочитал документацию Django в поле ManyToMany.Особенно тот, который здесь .Мне совершенно ясно, что с этим можно сделать.Например, если у меня есть модель категории и модель запуска, в которой у категории может быть много запусков, а запуск может принадлежать многим категориям, то здесь пригодится связь ManyToMany.Я могу перечислить все категории в моем шаблоне, каждая категория кликабельна и приводит к списку всех стартапов в другом шаблоне, принадлежащем к этой категории.Теперь, имея это, я хочу пойти немного дальше.Перейдя на страницу сведений о конкретной категории, которая представляет собой список принадлежащих ей стартапов, я хочу, чтобы каждый элемент на этой странице сведений также приводил к другой странице сведений, где я могу отображать дополнительную информацию о конкретном запуске.

Моя главная проблема в том, как я могу это реализовать.Я прошел через множество вопросов, заданных в отношении поля ManyToMany и его запросов, особенно здесь , но, похоже, все они задают вопрос о том, как получить доступ к связанным объектам в категории, например, на странице сведений, и она заканчивается.там.Я хочу перейти со страницы сведений на другую страницу сведений.

from django.db import models

Модель моей категории:

class Category(models.Model):
    name = models.Charfield(max_length=100)

    def __str__(self):
        return self.name

    def get_startups(self):
        return Startup.objects.filter(category=self)

Мои модели запуска:

class Startup(models.Model):
    name = models.CharField(max_length=100)
    founder_name = models.CharField(max_length=100)
    short_description = models.CharField(max_length=225)
    concept = models.TextField(help_text='how does this startup operate?')
    category = models.ManyToManyField(Category)
    website = models.URLField(max_length=225)
    logo = models.ImageField()


    def __str__(self):
        return self.name

    @property
    def logo_url(self):
        if self.logo and hasattr(self.logo, 'url'):
            return self.logo.url

В моемФайл views.py:

class CategoryView(ListView):
    template_name = 'myapp/startup-category.html'
    context_object_name = 'category_list'

    def get_queryset(self): 
        return Category.objects.all()


class DetailView(DetailView):
    model=Category
    template_name = 'myapp/startup-list.html'

В моих шаблонах / myapp / startup-category:

{% if category_list %}
<ul>
    {% for category in category-list %}
        <li><a href="{% url 'detail' category.pk %}">{{category.name}}</a></li>
    {% endfor %}
</ul>
{% endif %}

В шаблонах / myapp / startup-list.html:

{% for startup in category.get_startups %}
    <tr>
        {% if startup.logo %}
        <td><img src="{{ startup.logo_url|default_if_none:'#' }}" style="height: 50px; width: 50px;"></td>
        {% endif %}
        <td>{{startup.name}}</td>
        <td> {{startup.short_description}}</td>
        <td>
            <button type="button" ><a href="">View startup</a>
            </button></td>
    </tr>
{% endfor %}

В myapp.urls:

from django.urls import path
from . import views as core_views

path('startup_categories/', core_views.CategoryView.as_view(), name='startups'),
path('startup_categories/<int:pk>/', core_views.DetailView.as_view(), name='detail'),

Это отлично работает.Я получаю список категорий;когда я нажимаю на категорию, я перехожу на страницу с подробной информацией, где я получаю список стартапов, связанных с этой категорией, в табличной форме.На каждом элементе автозагрузки есть кнопка, которая ищет подробности запуска.Как мне реализовать просмотр деталей запуска?

Заранее спасибо!

1 Ответ

0 голосов
/ 23 октября 2018

определить URL-адрес примерно так:

 path('/startup/<int:startup_id>', views.view_startup, name='view-startup'),

В forms.py: (если у вас нет forms.py, создайте его в том же приложении)

 from .models import Startup
 from django.forms import ModelForm

 class StartupForm(ModelForm):
      class Meta:
           model = Startup
           fields = ['name', 'founder_name'] #Put name of all the fields that you want to display in template here

В представлениях.py

 from .forms import StartupForm
 def view_startup(request, startup_id):
     startup = get_object_or_404(Startup, pk=startup_id)
     startup_details_form = StartupForm(instance = startup)

     return render(request, "startup_details.html", {"form":startup_details_form})

В файле startup_details.html

  {% for field in form %}
       {{ field.label_tag }} : {{ field.value }}
  {% endfor %}

Теперь в своем файле startuplist.html вы можете просто поместить

  <button type="button" ><a href="{% url 'view-startup' startup.id %}">View startup</a>

Это просто, чтобы дать вамОсновная идея.Вероятно, не рекомендуется использовать идентификаторы в URL.Вы можете создать другое поле слагов в вашей модели запуска, которое будет содержать URL, а затем вы можете изменить соответствующие файлы, чтобы фактически использовать слаг вместо ID

...