Django ManyToMany关系细节的细节

时间:2018-10-23 13:49:18

标签: django django-templates django-views manytomanyfield

我已经很好地阅读了ManyToMany上的Django文档。特别是一个here。我非常清楚可以用它完成的事情。例如,如果我有一个Category模型和一个Startup模型,其中一个类别可以有很多启动,而一个启动可以属于许多类别,那么ManyToMany关系在这里很有用。我能够列出模板上的所有类别,每个类别都是可单击的,并导致属于该类别的另一个模板上的所有初创公司的列表。 现在,有了这个,我想进一步介绍。进入特定类别的详细信息页面,该列表是属于该类别的创业公司的列表,我希望该详细信息页面中的每个项目也都指向另一个详细信息页面,在其中我可以显示有关特定创业公司的更多信息。

我现在的主要问题是如何实现它。我已经回答了许多与ManyToMany字段及其查询有关的问题,尤其是here,但它们似乎都在考虑如何将相关对象访问到类别中,例如在详细信息页面中,该操作到此结束。我想从详细信息页面转到另一个详细信息页面。

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 %}

在templates / 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 :(得分:0)

定义如下网址:

 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

在views.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>

这只是给您一个基本的想法。在网址中使用ID可能不是一个好习惯。您可以在启动模型中创建另一个将包含URL的Slug字段,然后可以修改相关文件以实际使用Slug而不是ID