django ManyToMany 显示相关对象
django ManyToMany show related objects
到处找,感觉很简单,也没找到。
所以基本上我的 models.py
中有两个 类
class Restaurant(models.Model):
restaurant_title = models.CharField(max_length=30)
location = CountryField(null=True, blank_label='(select country)')
first_purchase_discount = models.BooleanField(default=False)
updated = models.DateTimeField(auto_now=True)
slug = models.SlugField(max_length=30, unique=True)
def save (self, *args, **kwargs):
self.slug = slugify(self.restaurant_title)
super(Restaurant, self).save(*args, **kwargs)
def __str__(self):
return self.restaurant_title
class Pizza(models.Model):
pizza_title = models.CharField(max_length=20)
restaurants = models.ManyToManyField('Restaurant', blank=True)
slug = models.SlugField(max_length=20, unique=True)
def save (self, *args, **kwargs):
self.slug = slugify(self.pizza_title)
super(pizza, self).save(*args, **kwargs)
def __str__(self):
return self.pizza_title
现在我所做的是在我的 admin.py
中注册模型。
我在那里创建了比方说 Restaurant Toni 和 Restaurant Pappo。
另一方面,我创建了比萨饼:A、B、C 和 D。
通过 ManyToMany 关系,我连接了 Pizza A,B and C to Toni
和 B, C and D to Pappo
.
在我的 views.py
中,我创建了一个列表视图,它作为主页显示所有餐厅的显示位置:
restaurants = Restaurant.objects.all()
为了列出 Pizza,我创建了一个 DetailView。我在 restaurant_list.html(用作主页)中创建了一个 link 来访问 Pizzas
{% for restaurant in restaurants %}
<h2><a href="{% url 'pizza_detail' restaurant.slug %}">{{ restaurant.restaurant_title }}</a></h2>
{% endfor%}
我找到了餐馆,每个 link 都把我送到了我与之关联的比萨饼,或者至少我希望这种情况发生。
这里是我的 views.py
的清晰视野
class RestaurantListView(ListView):
model = Restaurant
def get_context_data(self, **kwargs):
context = super(RestaurantListView, self).get_context_data(**kwargs)
return context
def home(request):
template = 'restaurant/restaurant_list.html'
restaurants = Restaurant.objects.all()
context = {
'restaurants': restaurants
}
return render(request, template, context)
class PizzaDetailView(DetailView):
model = Pizza
def get_context_data(self, **kwargs):
context = super(ShopDetailView, self).get_context_data(**kwargs)
return context
def pizza_detail(request, slug):
template = 'restaurant/pizza_detail.html'
pizzas = Pizza.objects.all()
context = {
'pizzas': pizzas,
}
return render(request, template, context)
由于披萨 = Pizza.objects.all() 我显然得到了所有的披萨。但是当然我只想要相关的那些,这意味着当我点击 Toni 时,我想在我点击 "it's" link 时看到 Pizze A、B 和 C 以及 Pappo 的相关 Pizzas。 52=]
我是否必须更改 pizzas = Pizza.objects.all()
或 pizza_detail.html
中的 for loop
,目前看起来像这样?
{% for pizza in pizzas %}
<h1>{{pizza.pizza_title}}</h1>
{% endfor%}
希望你明白我的意思。
Ps:你能告诉我如何在我的 pizza_detail.html 中显示餐厅名称吗?我通过它点击了 link。
非常感谢 <3
编辑
home.urls.py
urlpatterns = [
url('admin/', admin.site.urls),
url(r'^users/', include('django.contrib.auth.urls')),
url(r'^', include('restaurant.urls')),
]
restaurant.urls.py
urlpatterns = [
path('', home, name='restaurant_list'),
path('restaurant/<slug:slug>/', pizza_detail, name='pizza_detail')
]
Pizza 和 Restaurant 是多对多关系。您可以使用 prefetch_related() 从餐厅模型中查找比萨饼,反之亦然
示例:比萨饼 = Pizza.objects.all().prefetch_related('restaurants')
如果您想在 pizza_detail.html 中显示餐厅名称。使用示例查询并像这样更改 html。
{% for pizza in pizzas %}
{% for restaurant in pizza.restaurants %}
{{restaurant.restaurant_title}}
{% endfor%}
{% endfor%}
如果您想要在点击时与特定餐厅相关的比萨饼,您还应该使用 Restaurant
模型来过滤您的数据
所以在views.py
def pizza_detail(request, slug):
template = 'restaurant/pizza_detail.html'
restaurant = Restaurant.objects.get(slug=slug)
pizzas = Pizza.objects.filter(restaurants__in=[restaurant])
context = {
'pizzas': pizzas,
'restaurant': restaurant
}
return render(request, template, context)
并在 pizza_detail.html
<h1>Restaurant : {{ restaurant.restaurant_title }}</h1>
{% for pizza in pizzas %}
<h3>{{pizza.pizza_title}}</h3>
{% endfor%}
注意 :restaurants__in
查找只接受迭代,因此特定的 Restaurant
对象作为 list
.
传递
到处找,感觉很简单,也没找到。
所以基本上我的 models.py
class Restaurant(models.Model):
restaurant_title = models.CharField(max_length=30)
location = CountryField(null=True, blank_label='(select country)')
first_purchase_discount = models.BooleanField(default=False)
updated = models.DateTimeField(auto_now=True)
slug = models.SlugField(max_length=30, unique=True)
def save (self, *args, **kwargs):
self.slug = slugify(self.restaurant_title)
super(Restaurant, self).save(*args, **kwargs)
def __str__(self):
return self.restaurant_title
class Pizza(models.Model):
pizza_title = models.CharField(max_length=20)
restaurants = models.ManyToManyField('Restaurant', blank=True)
slug = models.SlugField(max_length=20, unique=True)
def save (self, *args, **kwargs):
self.slug = slugify(self.pizza_title)
super(pizza, self).save(*args, **kwargs)
def __str__(self):
return self.pizza_title
现在我所做的是在我的 admin.py
中注册模型。
我在那里创建了比方说 Restaurant Toni 和 Restaurant Pappo。
另一方面,我创建了比萨饼:A、B、C 和 D。
通过 ManyToMany 关系,我连接了 Pizza A,B and C to Toni
和 B, C and D to Pappo
.
在我的 views.py
中,我创建了一个列表视图,它作为主页显示所有餐厅的显示位置:
restaurants = Restaurant.objects.all()
为了列出 Pizza,我创建了一个 DetailView。我在 restaurant_list.html(用作主页)中创建了一个 link 来访问 Pizzas
{% for restaurant in restaurants %}
<h2><a href="{% url 'pizza_detail' restaurant.slug %}">{{ restaurant.restaurant_title }}</a></h2>
{% endfor%}
我找到了餐馆,每个 link 都把我送到了我与之关联的比萨饼,或者至少我希望这种情况发生。
这里是我的 views.py
class RestaurantListView(ListView):
model = Restaurant
def get_context_data(self, **kwargs):
context = super(RestaurantListView, self).get_context_data(**kwargs)
return context
def home(request):
template = 'restaurant/restaurant_list.html'
restaurants = Restaurant.objects.all()
context = {
'restaurants': restaurants
}
return render(request, template, context)
class PizzaDetailView(DetailView):
model = Pizza
def get_context_data(self, **kwargs):
context = super(ShopDetailView, self).get_context_data(**kwargs)
return context
def pizza_detail(request, slug):
template = 'restaurant/pizza_detail.html'
pizzas = Pizza.objects.all()
context = {
'pizzas': pizzas,
}
return render(request, template, context)
由于披萨 = Pizza.objects.all() 我显然得到了所有的披萨。但是当然我只想要相关的那些,这意味着当我点击 Toni 时,我想在我点击 "it's" link 时看到 Pizze A、B 和 C 以及 Pappo 的相关 Pizzas。 52=]
我是否必须更改 pizzas = Pizza.objects.all()
或 pizza_detail.html
中的 for loop
,目前看起来像这样?
{% for pizza in pizzas %}
<h1>{{pizza.pizza_title}}</h1>
{% endfor%}
希望你明白我的意思。
Ps:你能告诉我如何在我的 pizza_detail.html 中显示餐厅名称吗?我通过它点击了 link。 非常感谢 <3
编辑
home.urls.py
urlpatterns = [
url('admin/', admin.site.urls),
url(r'^users/', include('django.contrib.auth.urls')),
url(r'^', include('restaurant.urls')),
]
restaurant.urls.py
urlpatterns = [
path('', home, name='restaurant_list'),
path('restaurant/<slug:slug>/', pizza_detail, name='pizza_detail')
]
Pizza 和 Restaurant 是多对多关系。您可以使用 prefetch_related() 从餐厅模型中查找比萨饼,反之亦然
示例:比萨饼 = Pizza.objects.all().prefetch_related('restaurants')
如果您想在 pizza_detail.html 中显示餐厅名称。使用示例查询并像这样更改 html。
{% for pizza in pizzas %}
{% for restaurant in pizza.restaurants %}
{{restaurant.restaurant_title}}
{% endfor%}
{% endfor%}
如果您想要在点击时与特定餐厅相关的比萨饼,您还应该使用 Restaurant
模型来过滤您的数据
所以在views.py
def pizza_detail(request, slug):
template = 'restaurant/pizza_detail.html'
restaurant = Restaurant.objects.get(slug=slug)
pizzas = Pizza.objects.filter(restaurants__in=[restaurant])
context = {
'pizzas': pizzas,
'restaurant': restaurant
}
return render(request, template, context)
并在 pizza_detail.html
<h1>Restaurant : {{ restaurant.restaurant_title }}</h1>
{% for pizza in pizzas %}
<h3>{{pizza.pizza_title}}</h3>
{% endfor%}
注意 :restaurants__in
查找只接受迭代,因此特定的 Restaurant
对象作为 list
.