【问题标题】:How To Save A User's Favorite Posts in Django如何在 Django 中保存用户最喜欢的帖子
【发布时间】:2018-03-04 18:06:26
【问题描述】:

所以,我试图让用户收藏一个帖子(在我的情况下为交易),稍后将显示在他们的个人资料页面上。

**已更新——我遇到的问题——提交保存收藏夹的表单时,收藏夹没有保存在数据库中。

我最初的灵感来自这篇帖子here

所以我向我的用户模型添加了一个“收藏夹”字段,在我的交易模型上具有多对多关系......就像这样:

favorites = models.ManyToManyField(Deal, related_name='favorited_by')

用户可以收藏“交易”的我的 html 模板如下所示:

<form id="favorite{{deal_detail.id}}" method="POST" action="{% url 'deals:favorite' deal_detail.id %}">
                            {% csrf_token %}
                            <input type="hidden" name="supporttype" />
                            <input type="submit" value="Add Deal to Favorites" />

我收藏的网址是这样的:

url(r'^(?P&lt;pk&gt;[0-9]+)/favorite', favorite, name='favorite')

这是“deal_detail”和“favorite”的视图

def deal_by_detail(request, slug):
    deal_detail = Deal.objects.get(slug=slug)
    return render(request, 'deals/deal_detail.html', {'deal_detail': deal_detail})


def favorite(request, pk):
    if request.method == 'POST':
        deal = Deal.objects.get(pk=pk)
        deal.save()
        messages.add_message(request, messages.INFO, 'Deal Favorited.')
        return redirect('home')

这是我的完整用户和交易模型:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, error_messages={'unique':"This email has already been registered."})
    username = models.CharField(max_length=40, default='')
    first_name = models.CharField(max_length=40, default='', blank=True)
    last_name = models.CharField(max_length=40, default='', blank=True)
    date_joined = models.DateTimeField(default=timezone.now)
    favorites = models.ManyToManyField(Deal, related_name='favorited_by', null=True, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

class Deal(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=140, unique=True)
    description = models.TextField(default='')
    retailer = models.ForeignKey(Retailer)
    image = VersatileImageField('deal image',
                               upload_to=deal_upload_path,
                               null=True,
                               blank=True)
    link = models.URLField(default='')
    category = models.ForeignKey(Category)
    date_added = models.DateField(default=timezone.now)
    date_expires = models.DateField(default=timezone.now)
    price = models.CharField(max_length=140)
    secondary_price = models.CharField(max_length=140, default='')
    likes_total = models.IntegerField(default=1)

【问题讨论】:

  • 也许所有都出现了(仅供选择),但选择的都是正确的。检查查询集。
  • 您的实际问题是什么?
  • 好的,所以我检查了查询集,提交表单时似乎没有将收藏夹保存到数据库中。在管理员中,我实际上能够为特定用户选择一个收藏夹...所以问题出在我的表单上——不确定您是否在那里看到任何问题?
  • 一定是因为我将交易对象保存在favorite 视图中...“收藏夹”字段在我的用户模型中...我将复制上面的完整模型

标签: python django


【解决方案1】:

好的,所以我不确定这是否是执行此操作的完美方法,但它似乎有效。我创建了一个变量 'favorite' 来抓取所选项目,然后保存在用户对象中。

def favorite(request, pk):
    if request.method == 'POST':
        favorite = Deal.objects.get(pk=pk)
        user = request.user
        user.favorites.add(favorite)
        messages.add_message(request, messages.INFO, 'Deal Favorited.')
        return redirect('home')

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2020-12-12
    • 2020-09-03
    • 2020-11-04
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多