Отображение различных данных на основе имени (Django)

Я делаю сайт онлайн доставки еды, используя Django. У меня есть таблица, показывающая название каждого ресторана и часы работы. Если пользователь нажимает на название ресторана, я хочу, чтобы на новой странице отображалось меню этого ресторана. Как мне это сделать?

Ниже представлен мой код для models.py

class Restaurant(models.Model):
    photo = models.ImageField(upload_to="images/")
    name = models.CharField(max_length=50, primary_key=True)
    phone = models.CharField(max_length=15)
    hours = models.CharField(max_length=100)
    website = models.TextField()
    category = models.CharField(max_length=20)

    def __str__(self):
        return self.name

class Menu(models.Model):
    restaurant_name = models.CharField(max_length=50)
    item = models.CharField(max_length=20, default='item')
    price = models.DecimalField(max_digits=5, decimal_places=2)
    
    def __str__(self):
        return self.item

Ниже приведен мой код для menu.html

<div class="container">

    <table class="table text-center">
        <thead>
            <tr>
                <th scope="col">Item</th>
                <th scope="col">Price</th>
                <th scope="col">Add to Cart</th>
            </tr>
            </tr>
        </thead>
        <tbody>

            <tr>
                <td> {{ }} </td>
                <td>$ {{ }}</td>
                <td><button class="btn">Add</button></td>
            </tr>

        </tbody>
    </table>

</div>

Вам необходимо создать отношение ForeignKey между моделями Menu и Restaurant. Ресторан может иметь несколько меню (возможно, меню обеда, меню ужина, меню десерта и т.д.), но меню может принадлежать только одному ресторану. Это отношение Many-to-One между Menu и Restaurant. Вы можете использовать отношения один-к-одному, если на один ресторан приходится только одно меню, но первый вариант, на мой взгляд, более перспективен.

Замените поле restaurant_name в модели Menu следующим:

class Menu(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='menus')

Опция on_delete означает, что при удалении ресторана его меню также будет удалено.

related_name позволяет запросить обратное отношение, чтобы получить все меню ресторана с restaurant.menus.all() в представлениях или restaurant.menus.all в шаблонах.

Затем сделайте makemigrations и перенесите базу данных. Будьте осторожны с подобными изменениями, так как они могут вызвать ошибки целостности.

Что касается того, как получить доступ к нему в вашем шаблоне, это зависит от того, как выглядят ваши представления/урлы. Пожалуйста, опубликуйте представление детализации меню и url для получения помощи в этом вопросе. Я не знаю, как структурированы ваши url-параметры и используете ли вы общие / основанные на функциях представления.

Некоторые другие проблемы с вашими моделями, которые я заметил:

  • Зачем использовать название ресторана в качестве первичного ключа? Что если два ресторана в разных местах имеют одинаковое название? Вам следует придерживаться автоинкрементного первичного ключа по умолчанию. Если вы не хотите, чтобы первичные ключи отображались в ваших URL, создайте отдельное уникальное поле SlugField для использования в параметрах url.
  • .
  • Вам следует использовать поле URLField для веб-сайта, если вы хотите хранить ссылку для лучшей валидации на уровне формы и БД.
  • Скорее всего, вы захотите сделать категорию также ForeignKey и разделить ее на отдельную модель. Таким образом, вы сможете более легко запрашивать все рестораны определенной категории.
Вернуться на верх