django ManyToMany показать связанные объекты - PullRequest
0 голосов
/ 03 июля 2018

Искал везде, но ничего не мог найти, хотя это так просто.

Так что в основном у меня есть два класса в моем 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. Через отношения ManyToMany я соединил Pizza A,B and C to Toni и B, C and D to Pappo.

В моем views.py я создал Listview, который функционирует как домашняя страница, чтобы показать, где отображаются все рестораны:

restaurants = Restaurant.objects.all()

Чтобы перечислить пиццу, я создал DetailView. Я создал ссылку в моем 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 () я, очевидно, получаю все пиццы. Но, конечно, я хочу только связанные с ними, что означает, что когда я нажимаю на Тони, я хочу видеть Pizze A, B и C и связанные пиццы для Pappo, когда я нажимаю на ссылку «это».

Должен ли я изменить pizzas = Pizza.objects.all() или for loop в моем pizza_detail.html, который сейчас выглядит следующим образом?

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

Надеюсь, вы поняли мою точку зрения.

Ps: можете ли вы также сказать мне, как также показать название ресторана в моем pizza_detail.html, через который я нажал на ссылку. Большое спасибо <3 </p>

EDIT

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')  
]

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Если вы хотите, чтобы пиццы относились к конкретному ресторану при нажатии на них, вам также следует использовать модель 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.

0 голосов
/ 03 июля 2018

Пицца и ресторан - это отношения ManytoMany. Вы можете использовать prefetch_related () для просмотра пиццы из модели ресторана или наоборот

пример: pizzas = Pizza.objects.all (). Prefetch_related ('restaurant')

если вы хотите показать название ресторана в pizza_detail.html. Используйте пример запроса и измените html следующим образом.

{% for pizza in pizzas %}
           {% for restaurant in pizza.restaurants %}   
                 {{restaurant.restaurant_title}}
           {% endfor%}
{% endfor%}
...