django ManyToMany 显示相关对象



到处搜索,但即使感觉很简单,也找不到任何东西。

所以基本上我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中注册模型。 在那里,我创建了托尼餐厅和帕波餐厅。 另一方面,我创建了披萨:A,B,C和D。 通过多对多的关系,我Pizza A,B and C to ToniB, C and D to Pappo联系起来。

在我的views.py中,我创建了一个列表视图,它充当主页,通过以下方式显示所有餐厅的显示位置:

restaurants = Restaurant.objects.all()

为了列出披萨,我创建了一个详细信息视图。我在restaurant_list.html(用作主页(中创建了一个链接来访问比萨饼

{% for restaurant in restaurants %} 
<h2><a href="{% url 'pizza_detail' restaurant.slug %}">{{ restaurant.restaurant_title }}</a></h2>
{% endfor%}

我得到了餐馆,每个餐馆都把我链接到我与之相关的比萨饼,或者至少我希望这种情况发生。

在这里,我的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"链接时看到Pizze A,B和C以及相关的Pizzas for Pappo。

我是否必须更改pizzas = Pizza.objects.all()pizza_detail.html中的for loop,现在看起来像这样?

{% for pizza in pizzas %}
<h1>{{pizza.pizza_title}}</h1>                  
{% endfor%}

希望你明白我的意思。

Ps:您能否告诉我如何在我点击链接的pizza_detail.html中显示餐厅的名称。 非常感谢 <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')  
]

如果您希望在单击比萨饼时与特定餐厅相关,则还应使用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传递。

披萨和餐厅是多对多的关系。您可以使用 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%}

相关内容

  • 没有找到相关文章

最新更新