django对象中的书签在添加用户实例时得到了simplelazyobject为什么

问题描述 投票:0回答:1

浪费了大量时间进行研究,并试图弄清楚如何在Django中实现书签。我尝试了CBV,但我放弃了。我尝试了fbv,但我不断收到此错误:

TypeError at 'Bookmark' instance expected, got SimpleLazyObject: User: ****

这是我的观点:

@login_required
def company_bookmark(request, slug):
    user = request.user
    model = get_object_or_404(Company, slug=slug)
    if user.is_authenticated:
        if model.bookmark.filter(id=user.id).exists():
            model.bookmark.remove(request.user)
        else:
            model.bookmark.add(request.user)
            return HttpResponseRedirect(model.get_absolute_url())
    else:
        messages.warning(request, 'you must be authenticated first')

我将其包装在条件语句中,仍然出现相同的错误,我在html中添加了条件,但无济于事

    {% if request.user.is_authenticated %}
    <a href="{% url 'company:bookmark' slug=company.slug %}"
       value="{{ company.slug }}" type="submit" class="btn_1 full-width outline wishlist">
      <i class="icon_heart"></i> Add to Favourite
    </a>
    {% endif %}

我什至试图添加ID来查看这样的内容

model.bookmark.remove(request.user.id)

带来另一个错误:

AttributeError at
'int' object has no attribute '_state'

这里是模特

class Company(models.Model):
    name = models.CharField(max_length=120, help_text='Name of your company', )
    slug = models.SlugField(unique=True, blank=True, null=True)
    bookmark = GenericRelation(Bookmark,  related_query_name='company_bookmark')

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        slug = slugify(self.name)
        self.slug = slug
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('company:detail', kwargs={'slug': self.slug})


class Bookmark(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

和错误

Traceback:

File "C:\Users\postgres\desktop\job\env\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\postgres\desktop\job\env\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\postgres\desktop\job\env\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\postgres\desktop\job\env\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "C:\Users\postgres\desktop\biz\src\bookmarks\views.py" in company_bookmark
  18.             model.bookmark.add(request.user)

File "C:\Users\postgres\desktop\job\env\lib\site-packages\django\contrib\contenttypes\fields.py" in add
  598.                     check_and_update_obj(obj)

File "C:\Users\postgres\desktop\job\env\lib\site-packages\django\contrib\contenttypes\fields.py" in check_and_update_obj
  585.                         self.model._meta.object_name, obj

Exception Type: TypeError at /company/inceptor-kenya/bookmark
Exception Value: 'Bookmark' instance expected, got <SimpleLazyObject: <User: Gracelynn>>

如果能得到帮助,我将不胜感激。预先感谢。

django typeerror add attributeerror bookmarks
1个回答
0
投票

出现此错误是因为您需要向Bookmark(其中Usermodel.bookmark实例)添加model实例而不是Company实例。

您的代码:

if model.bookmark.filter(id=user.id).exists():
    model.bookmark.remove(request.user)
else:
    model.bookmark.add(request.user)

例如,可以将其重做为类似的内容:

# search bookmarks of this 'Company' with this 'user'
bookmark = model.bookmark.filter(user=user).first()

if bookmark is not None:
    bookmark.delete()
else:
    bookmark = Bookmark()
    bookmark.user = request.user
    bookmark.content_object = model
    bookmark.save()
© www.soinside.com 2019 - 2024. All rights reserved.