Ну, магазин - это , а не часть запроса (строго говоря, user
тоже нет, но он часто добавляется к объекту request
в промежуточном программном обеспечении, просматривая сеанс).
Таким образом, вам необходимо закодировать в URL или в параметрах POST
. Например с:
# app/urls.py
from django.urls import path
from app.views import like_shop
urlpatterns = [
path('shop/<b><int:shop_id></b>/like', like_shop, name='like_shop'),
]
Затем в представлении мы получаем параметр shop_id
, который содержит id
связанного Shops
объекта:
from django.shortcuts import get_object_or_404
from app.models import Shops
def like_shop(request<b>, shop_id</b>):
if request.method == 'POST':
shop = <b>get_object_or_404(Shops, id=shop_id)</b>
form = LikeShopForm(request.POST)
if form.is_valid():
u = form.save(commit=False)
u.user = request.user
u.shop = <b>shop</b>
u.save()
return redirect('shops')
else:
form = LikeShopForm()
return render(request, "shops.html", {'form': form, 'shop_id': shop_id})
Тогда запрос в POST должен указывать на:
<!-- shops.html -->
<form action="<b>{% url 'like_shop' shop_id=shop_id %}</b>" method="post">
<!-- ... -->
</form>
URL-адрес этой страницы, таким образом, выглядит как /shops/123/like
с 123
id
магазина. Таким образом, если вы хотите пропустить магазин "неявно", вам нужно закодировать его в URL. В противном случае вы должны сделать это поле формы, чтобы пользователь мог выбрать опцию. Лично мне очень странно, что вы используете date_posted
в качестве поля формы, поскольку обычно это поле, которое я ожидаю заполнить отметкой времени, когда пользователю нравится магазин.
Примечание : название модели обычно единственное число , поэтому Shop
вместо Shops
.