Django-将表单保存到数据库中

时间:2018-09-10 14:07:54

标签: django-models django-forms django-views

嘿,我需要你的帮助

所以我有这个模型:

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'

请帮助我自动获取商店名称并将其保存在数据库中

1 个答案:

答案 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/like123的{​​{1}}商店。因此,如果您想“隐式”通过商店,则需要在URL中对其进行编码。否则,应将其设置为表单的字段,以便用户可以选择一个选项。我个人觉得您使用id作为表单字段很奇怪,因为通常我希望在用户喜欢这家商店时使用时间戳填充该字段。

  

注意:模型的名称通常为单数,因此是date_posted而不是Shop