到处搜索,但即使感觉很简单,也找不到任何东西。
所以基本上我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 Toni
和B, 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%}