Отображение различных данных на основе имени (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 и разделить ее на отдельную модель. Таким образом, вы сможете более легко запрашивать все рестораны определенной категории.