嘿,我需要你的帮助
所以我有这个模型:
class PreferedShops(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
shop = models.ForeignKey(Shops, on_delete=models.CASCADE)
date_posted = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.user.username, self.shop.name
这是表格:
class LikeShopForm(forms.ModelForm):
class Meta:
model = PreferedShops
fields = ['date_posted']
这是视图:
def shops(request):
if request.method == 'POST':
form = LikeShopForm(request.POST)
if form.is_valid():
u = form.save(commit=False)
u.user = request.user
u.shop = request.shop
u.save()
return redirect('shops')
else:
form = LikeShopForm()
return render(request, "shops.html", {'form': form})
我遇到的问题是,当我单击“赞”按钮时,我希望该表单自动获取用户和商店名称,然后将其保存到数据库中 用户和商店名称应隐藏 当我单击提交时,出现此错误'WSGIRequest'对象没有属性'shop'
请帮助我自动获取商店名称并将其保存在数据库中
答案 0 :(得分:0)
该商店不是请求的一部分(严格来说,user
也不是请求的一部分,但是通常通过查看将其添加到中间件中的request
对象中)在会议上)。
因此,您需要将其编码到URL或POST
参数中。例如:
# app/urls.py
from django.urls import path
from app.views import like_shop
urlpatterns = [
path('shop/<int:shop_id>/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, shop_id):
if request.method == 'POST':
shop = get_object_or_404(Shops, id=shop_id)
form = LikeShopForm(request.POST)
if form.is_valid():
u = form.save(commit=False)
u.user = request.user
u.shop = shop
u.save()
return redirect('shops')
else:
form = LikeShopForm()
return render(request, "shops.html", {'form': form, 'shop_id': shop_id})
然后POST中的请求应指向:
<!-- shops.html -->
<form action="{% url 'like_shop' shop_id=shop_id %}" method="post">
<!-- ... -->
</form>
因此,此页面的URL看起来像/shops/123/like
和123
的{{1}}商店。因此,如果您想“隐式”通过商店,则需要在URL中对其进行编码。否则,应将其设置为表单的字段,以便用户可以选择一个选项。我个人觉得您使用id
作为表单字段很奇怪,因为通常我希望在用户喜欢这家商店时使用时间戳填充该字段。
注意:模型的名称通常为单数,因此是
date_posted
而不是Shop
。