简体   繁体   English

如何在Django中保存用户喜欢的帖子

[英]How To Save A User's Favorite Posts in Django

So, i'm trying to allow a user to favorite a post (in my case Deals), which will later be displayed on their profile page. 因此,我试图允许用户收藏一个帖子(在我的情况下为Deals),该帖子稍后将显示在他们的个人资料页面上。

**UPDATED --The problem I'm having--when the form to save a favorite is submitted, the favorite is not saving in database. **更新-我遇到的问题-提交保存收藏夹的表单时,收藏夹未保存在数据库中。

I got my initial inspiration from this post here 我得到了我这个职位最初的灵感在这里

So i added a 'favorites' field to my User model with a Many to Many relationship on my Deal model...like so: 因此,我在我的用户模型中添加了一个“收藏夹”字段,并在我的交易模型中建立了多对多关系...

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

My html template where a user can favorite a 'Deal' looks like this: 用户可以在其中收藏“交易”的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" />

My url for favorites is this: 我最喜欢的网址是这样的:

url(r'^(?P<pk>[0-9]+)/favorite', favorite, name='favorite')

this is the view for 'deal_detail' and 'favorite' 这是“ deal_detail”和“收藏夹”的视图

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')

and here are my full User and Deals models: 这是我完整的用户和交易模型:

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)

Okay, so i'm not sure if this is the perfect way to do this, but it appears to be working. 好的,所以我不确定这是否是执行此操作的理想方法,但它似乎正在起作用。 I created a variable 'favorite' to grab the selected item and then then saved in the user object. 我创建了一个变量“收藏夹”以获取所选项目,然后将其保存在用户对象中。

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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM